it-swarm-vi.com

Bất biến là gì, làm thế nào chúng có thể được sử dụng và bạn đã bao giờ sử dụng nó trong chương trình của mình chưa?

Tôi đang đọc Coders tại nơi làm việc, và trong đó có rất nhiều thảo luận về bất biến. Theo như tôi đã hiểu, bất biến là một điều kiện giữ cả trước và sau một biểu thức. Chúng, trong số những thứ khác, hữu ích trong việc chứng minh rằng vòng lặp đó là chính xác, nếu tôi nhớ chính xác khóa học Logic của mình.

Là mô tả của tôi chính xác, hoặc tôi đã bỏ lỡ một cái gì đó? Bạn đã bao giờ sử dụng chúng trong chương trình của bạn? Và nếu vậy, họ đã được lợi như thế nào?

54
gablin

Trong OOP, bất biến là một tập hợp các xác nhận phải luôn luôn đúng trong suốt vòng đời của một đối tượng để chương trình có hiệu lực. Nó nên giữ đúng từ cuối của hàm tạo cho đến khi bắt đầu hàm hủy bất cứ khi nào đối tượng hiện không thực thi một phương thức thay đổi trạng thái của nó.

Một ví dụ về bất biến có thể là chính xác một trong hai biến thành viên là null. Hoặc nếu một cái có một giá trị nhất định, thì tập hợp các giá trị được phép cho cái kia là cái này hoặc cái kia ...

Thỉnh thoảng tôi sử dụng một hàm thành viên của đối tượng để kiểm tra xem bất biến có giữ không. Nếu đây không phải là trường hợp, một khẳng định được đưa ra. Và phương thức được gọi ở đầu và thoát của mỗi phương thức làm thay đổi đối tượng (trong C++, đây chỉ là một dòng ...)

47
Xavier Nodet

Chà, những thứ tôi thấy trong chủ đề này đều tuyệt vời, nhưng tôi có một định nghĩa về một "bất biến" rất hữu ích cho tôi trong công việc.

Bất biến là bất kỳ quy tắc logic nào phải được tuân theo trong suốt quá trình thực thi chương trình của bạn có thể được truyền đạt tới người, nhưng không phải với trình biên dịch của bạn.

Định nghĩa này rất hữu ích vì nó tách các điều kiện thành hai nhóm: những trình biên dịch có thể được tin cậy khi thực thi và những nhóm phải được ghi lại, thảo luận, nhận xét hoặc truyền đạt tới những người đóng góp để họ tương tác với codebase mà không gây ra lỗi .

Ngoài ra, định nghĩa này rất hữu ích vì nó cho phép bạn sử dụng khái quát hóa, "Bất biến là xấu".

Ví dụ, bộ chuyển động trong một chiếc xe số tay được thiết kế để tránh bất biến. Nếu tôi muốn, tôi có thể xây dựng một hộp số với một đòn bẩy cho mỗi thiết bị. Đòn bẩy này có thể được chuyển tiếp ("tham gia") hoặc quay lại ("thảnh thơi"). Trong một hệ thống như vậy, tôi đã tạo ra một "bất biến", có thể được ghi lại như sau:

"Điều rất quan trọng là thiết bị hiện đang được tháo ra trước khi một thiết bị khác được tham gia. Để tham gia bất kỳ hai bánh răng nào cùng một lúc sẽ gây ra căng thẳng cơ học sẽ xé tan bộ truyền. Luôn luôn ngắt thiết bị hiện đang tham gia trước khi gắn thiết bị khác."

Và do đó, người ta có thể đổ lỗi cho việc truyền bị hỏng khi lái xe cẩu thả. Tuy nhiên, những chiếc xe hiện đại sử dụng một cây gậy duy nhất xoay quanh các bánh răng. Nó được thiết kế theo cách mà trên một chiếc xe sang số hiện đại, không thể tham gia hai bánh răng cùng một lúc.

Theo cách này, chúng ta có thể nói rằng việc truyền tải đã được thiết kế để "loại bỏ bất biến", bởi vì nó không cho phép bản thân được cấu hình cơ học theo cách vi phạm quy tắc logic.

Mọi bất biến của loại này mà bạn loại bỏ khỏi mã của mình là một sự cải tiến, bởi vì nó làm giảm tải nhận thức khi làm việc với nó.

15
Daniel Burbank

Dựa trên trích dẫn sau đây của Coders At Work ...

Nhưng một khi bạn biết bất biến mà nó đang duy trì, bạn có thể thấy, à, nếu chúng ta duy trì bất biến đó thì chúng ta sẽ có thời gian tra cứu nhật ký.

... Tôi đoán "bất biến" = "điều kiện bạn muốn duy trì để đảm bảo hiệu quả mong muốn".

Dường như bất biến có hai giác quan khác nhau một cách tinh tế:

  1. Một cái gì đó vẫn giữ nguyên.
  2. Một cái gì đó mà bạn đang cố gắng giữ nguyên, để đạt được mục tiêu X (chẳng hạn như "thời gian tra cứu nhật ký" ở trên).

Vì vậy, 1 giống như một khẳng định; 2 giống như một công cụ để chứng minh tính đúng đắn, hiệu suất hoặc các thuộc tính khác - tôi nghĩ vậy. Xem bài viết trên Wikipedia để biết ví dụ về 2 (chứng minh tính đúng đắn của giải pháp cho câu đố MU).

Thật ra cảm giác bất biến thứ 3 là:

.3. Những gì chương trình (hoặc mô-đun hoặc chức năng) phải làm; nói cách khác, mục đích của nó.

Từ cùng một Coders Tại nơi phỏng vấn:

Nhưng điều làm cho phần mềm lớn có thể quản lý được là có một số bất biến toàn cầu hoặc tuyên bố lớn về những gì nó phải làm và những gì được cho là đúng.

3
Jonathan Aquino

Một bất biến (theo cách hiểu thông thường) có nghĩa là một số điều kiện phải đúng tại một số thời điểm hoặc thậm chí luôn luôn trong khi chương trình của bạn đang thực thi. ví dụ. PreConditions và PostConditions có thể được sử dụng để khẳng định một số điều kiện phải đúng khi hàm được gọi và khi nó trả về. Các bất biến đối tượng có thể được sử dụng để khẳng định rằng một đối tượng phải có trạng thái hợp lệ trong suốt thời gian nó tồn tại. Đây là thiết kế theo nguyên tắc hợp đồng.
[.___.] Tôi đã sử dụng bất biến một cách không chính thức bằng cách sử dụng séc trong mã. Nhưng gần đây tôi đang chơi với mã thư viện hợp đồng cho .Net hỗ trợ trực tiếp bất biến.

3
softveda

Một bất biến giống như một quy tắc hoặc một giả định có thể được sử dụng để ra lệnh logic cho chương trình của bạn.

Ví dụ: giả sử bạn có một số ứng dụng phần mềm theo dõi tài khoản người dùng. Giả sử người dùng cũng có thể có nhiều tài khoản, nhưng vì bất kỳ lý do gì bạn cần phân biệt giữa tài khoản chính của người dùng và tài khoản "bí danh".

Đây có thể là bản ghi DB hoặc một cái gì đó khác, nhưng bây giờ, giả sử mỗi tài khoản người dùng được đại diện bởi một đối tượng lớp.

lớp userAccount {private char * pUserName; char riêng * pParentAccountUserName;

...}

Một bất biến có thể là giả định rằng nếu pParentAccountUserName là NULL hoặc trống thì đối tượng này là tài khoản mẹ. Bạn có thể sử dụng bất biến này để phân biệt các loại tài khoản khác nhau. Có lẽ có các phương pháp tốt hơn để phân biệt các loại tài khoản người dùng khác nhau, vì vậy hãy nhớ rằng đây chỉ là một ví dụ để cho thấy cách bất biến có thể được sử dụng.

1
Pemdas

Xuất phát từ một nền tảng vật lý, trong vật lý, chúng ta có các bất biến, về cơ bản là các đại lượng không thay đổi trong toàn bộ tính toán/mô phỏng. Ví dụ, trong vật lý, đối với toàn bộ hệ thống năng lượng được bảo toàn. Hoặc một lần nữa trong vật lý, nếu hai hạt va chạm, các mảnh kết quả phải chứa chính xác năng lượng mà chúng bắt đầu và chính xác cùng một động lượng (một đại lượng vectơ). Thông thường không có đủ bất biến để hoàn toàn chỉ định kết quả. Ví dụ, trong vụ va chạm 2 hạt, chúng ta có bốn bất biến, ba thành phần động lượng và một thành phần năng lượng, nhưng hệ thống có sáu bậc tự do (sáu số để mô tả trạng thái của nó). Các bất biến phải được bảo toàn trong phạm vi làm tròn, nhưng bảo tồn của chúng không chứng minh được giải pháp là đúng.

Vì vậy, thông thường, những điều này rất quan trọng khi kiểm tra sự tỉnh táo, nhưng bản thân chúng không thể chứng minh tính đúng đắn.

1
Omega Centauri