Tại sao bất biến quan trọng trong Khoa học Máy tính


16

Tôi hiểu "bất biến" theo nghĩa đen của nó. Tôi cũng nhận ra chúng khi tôi gõ mã. Nhưng tôi không nghĩ rằng tôi hiểu tầm quan trọng của thuật ngữ này trong bối cảnh khoa học máy tính.

Bất cứ khi nào tôi đọc các cuộc hội thoại \ bài báo trắng về thiết kế ngôn ngữ từ các lập trình viên nổi tiếng \ các nhà khoa học máy tính, thuật ngữ 'bất biến' liên tục xuất hiện như một biệt ngữ; và đó là phần tôi không hiểu. Chuyện gì khiến nó đặc biệt như vậy?


Tôi sử dụng các xác nhận rất nhiều ... không quá nhiều để đảm bảo tính chính xác để giảm khả năng xảy ra lỗi.
Công việc

Câu trả lời:


7

Một thuật toán là một quá trình lặp lại. Nếu nó có thể lặp lại, nó phải có các thuộc tính không thay đổi theo sự lặp lại. Đây là những bất biến của bạn. Các bất biến được kết hợp với và / hoặc hoạt động trên dữ liệu khác nhau (có khả năng) sẽ được đưa vào thuật toán của bạn.

Do đó, toàn bộ quan điểm của lập trình là xác định những gì không thay đổi - đó thực chất là chương trình của bạn.

Trong chương trình hướng đối tượng, có một khái niệm rằng mỗi đối tượng nên làm tốt một việc. Điều này về cơ bản có nghĩa là (đối với OOP dựa trên lớp), một lớp xác định các bất biến cho một thuật toán duy nhất, cùng với các trình giữ chỗ (biến) cho bất kỳ dữ liệu biến thể nào mà các đối tượng của nó có thể cần. Lý tưởng nhất là trong OO, bạn sẽ cô lập những gì thay đổi nhiều nhất có thể, sao cho mỗi đối tượng chủ yếu là bất biến.


27

Khái niệm bất biến được liên kết chặt chẽ với 'tác dụng phụ'. Tôi tin rằng nó đã được quảng bá theo phương pháp 'Thiết kế theo hợp đồng (DbC)' của Bertrand Meyer cho thiết kế phần mềm.

DbC làm phong phú các kiểu dữ liệu trừu tượng (xương sống của các lớp) với 3 khái niệm quan trọng, điều kiện tiên quyết, hậu điều kiện, bất biến . Nó dễ dàng được giải thích khi đề cập đến các thủ tục, vì vậy tôi sẽ cố gắng giải thích trong tài liệu tham khảo với nó:

  1. Một điều kiện tiên quyết đại diện cho dữ liệu đầu vào điều kiện cho một thủ tục phải tôn trọng để gọi thủ tục đó. Điều kiện tiên quyết này phải được tôn trọng và thực thi bởi khách hàng của thủ tục cụ thể đó. Tuy nhiên, người thiết kế thủ tục có thể bảo vệ các khách hàng không tôn trọng điều kiện tiên quyết bằng cách khẳng định điều kiện đó là các dòng đầu tiên trong quy trình. Ví dụ, có một phương pháp double divide(double dividend, double divisor)một điều kiện tiên quyết có thể là divisor != 0.

  2. Một postcondition thể hiện một điều kiện trên dữ liệu đầu ra sau khi thủ tục trả về; đó hoàn toàn là công việc của người thiết kế thủ tục để tôn trọng hậu điều kiện này với điều kiện là điều kiện tiên quyết được tôn trọng; trong một phong cách lập trình quốc phòng trước khi trở về, hậu quả có thể được khẳng định.

  3. Một bất biến có thể được coi là cả điều kiện tiên quyết và hậu điều kiện, nhưng với sự hiểu biết khác nhau về điều kiện tiên quyết và hậu điều kiện từ các khái niệm trên. Một bất biến về cơ bản nói rằng nếu đầu vào có một điều kiện cụ thể được đáp ứng trước khi thủ tục được gọi, thì điều kiện cụ thể đó là hợp lệ sau khi thủ tục được gọi. Ví dụ, một bất biến hợp lệ cho một thủ tục boolean search(int term, int array[])có thể nói rằng trạng thái arraytrước cuộc gọi giống như sau cuộc gọi.

Thực thi bất biến về thủ tục (và không chỉ thủ tục) là một điều tuyệt vời vì nó làm giảm tác dụng phụ ; Điều này rất hữu ích vì các tác dụng phụ là một tội ác lớn trong lập trình. Một thủ tục cụ thể có thể thay đổi trạng thái của các đối số đầu vào hoặc thay đổi trạng thái của một số biến toàn cục hoặc phụ thuộc vào một số biến toàn cục; điều này có thể dẫn đến các tình huống khó chịu khi hai cuộc gọi giống hệt nhau trên cùng một quy trình (có cùng đầu vào) có thể mang lại kết quả đầu ra khác nhau. Điều này dẫn đến việc biết lịch sử của các cuộc gọi và rất khó để gỡ lỗi, đặc biệt là trong bối cảnh đa luồng.


2

Một bất biến là một thuộc tính logic được bảo tồn bởi một số thao tác.

  • Bạn cần bất biến để lý do về các vòng lặp. Vì bạn không biết trước sẽ có bao nhiêu lần lặp (hoặc bạn sẽ không cần một vòng lặp), mỗi lần lặp phải bảo toàn bất biến, để cuối cùng bạn có thể chứng minh một số thuộc tính hữu ích về vòng lặp.

  • Bạn cần bất biến để lý giải về các thuộc tính của dữ liệu được đóng gói. Thông thường các dữ liệu khác nhau bên trong một mô-đun hoặc đối tượng cần đáp ứng các thuộc tính nhất định để hoạt động chính xác (ví dụ: danh sách đại diện cho một tập hợp phải luôn được sắp xếp). Bạn muốn rằng mỗi chức năng hoặc phương thức hoạt động trên dữ liệu sẽ bảo tồn các thuộc tính này, vì vậy chúng cũng là bất biến.


0

Từ những gì tôi biết tầm quan trọng của bất biến xuất phát từ thực tế rằng đó là khối xây dựng để chứng minh rằng một thuật toán thực hiện tính toán một hàm nhất định. Ví dụ, bạn đã phát triển một thuật toán sắp xếp mới nhưng làm thế nào bạn có thể chắc chắn rằng nó thực sự sắp xếp với mọi đầu vào hoặc với mọi đầu ra chính xác. Bước tiếp theo là xây dựng các bất biến tương ứng với dòng chảy của thuật toán và chứng minh rằng nó sắp xếp bằng cách sử dụng các bất biến.


0

Trong ngữ cảnh của hệ thống loại ngôn ngữ lập trình, loại bất biến là loại không chuyển đổi. Ví dụ, trong java, khi nạp chồng một phương thức, tất cả các tham số là bất biến, trong khi kiểu trả về là covariant (có thể giống hoặc một kiểu con).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.