2013-05-08 14 views
7

điều kiện tiên quyết thực tế của một subtype được tạo ra bằng cách kết hợp (sử dụng logic OR) điều kiện tiên quyết của một loại cơ sởđiều kiện tiên quyết của một subtype, mà làm điều kiện tiên quyết kết quảít hạn chếKhông thể làm suy yếu điều kiện tiên quyết và tăng cường điều kiện cũng vi phạm Nguyên tắc thay thế Liskov?

thực tế postcondition của một subtype được tạo ra bằng cách kết hợp (sử dụng logic AND) postconditions của một loại cơ sởpostcondition s của một subtype, mà làm cho hậu kết quảhạn chế hơn

Sau đây là những ví dụ về tăng cường điều kiện tiên quyếtsuy yếu postconditions, mà kết quả là vi phạm LSP (Link):

  1. Giả sử lớp cơ sở của bạn làm việc với một thành viên int. Bây giờ, loại phụ của bạn yêu cầu int phải dương. Điều này được tăng cường trước điều kiện, và bây giờ bất kỳ mã nào hoạt động hoàn hảo tốt trước khi có ints âm bị hỏng.

  2. Tương tự như vậy, giả sử cùng một trường hợp, nhưng lớp cơ sở được sử dụng để đảm bảo rằng thành viên sẽ dương sau khi được gọi. Sau đó, loại phụ thay đổi hành vi để cho phép int âm. Mã số hoạt động trên đối tượng (và giả định rằng sau điều kiện là một tích cực int) bây giờ đã bị hỏng vì sau điều kiện không được giữ nguyên.

a) Tại sao không phải là nó cũng được coi là một vi phạm LSP khi phương pháp ghi đè suy yếu một điều kiện tiên quyết, vì phương pháp này có thể sử dụng các thông số mà không phải là chấp nhận được hợp đồng của các cơ sở nhập. Như vậy, chúng tôi không thể tuyên bố rằng hợp đồng của loại cơ sở đã bị vi phạm và kết quả là LSP cũng bị vi phạm?

b) Tại sao không phải nó cũng được coi là một vi phạm LSP khi phương pháp ghi đè củng cố các hậu, kể từ khi khách hàng gọi phương pháp này sẽ chỉ nhận được một tập hợp con của các kết quả có thể có của các phương pháp ban đầu. Như vậy, chúng tôi không thể tuyên bố rằng hợp đồng của loại cơ sở đã bị vi phạm và kết quả là LSP cũng bị vi phạm?

Ví dụ:

cơ sở lớp hậu đảm bảo rằng giá trị trở của một phương pháp sẽ nằm trong phạm vi 1-10, nhưng sau đó kiểu phụ thay đổi hậu để chỉ cho phép giá trị trở để nằm trong phạm vi 2-9. Bây giờ mã hoạt động trên đối tượng được trả về từ phương thức này (và giả định rằng postcondition nằm trong phạm vi 1-10) bị hỏng do postcondition không được giữ nguyên.

Trả lời

-1

Tôi nghĩ rằng ví dụ bạn không hỗ trợ quan điểm của bạn theo nghĩa sau đây.

Trong int tiêu cực, ví dụ int tích cực, thêm số âm mặc dù nó bao gồm khả năng hơn suy yếu bảo lãnh của hậu điều kiện. Ví dụ của bạn làm điều tương tự. Mặc dù nó đảm bảo một phạm vi chặt chẽ hơn, nó vẫn làm suy yếu sự bảo đảm của hậu điều kiện được cung cấp bởi các lớp cơ sở.

Nguyên tắc sau tình trạng thực sự nói:

Quy luật này nói rằng phương pháp kiểu phụ cung cấp nhiều so với phương pháp siêu kiểu: khi nó trả về tất cả những gì các phương pháp supertype sẽ cung cấp được đảm bảo, và có thể một số tác dụng bổ sung như well (Phát triển chương trình bằng Java, p177)

Ví dụ của bạn không đảm bảo mọi thứ mà siêu bảo đảm đảm bảo. Tôi đoán trong ví dụ của bạn tăng cường sẽ có nghĩa là các loại phụ đảm bảo rằng các int trở lại là trong 1-10, hơn nữa nó đảm bảo rằng các int trở lại là ở giữa 2-9, không chỉ là thứ hai.

-1

Nếu hợp đồng cơ sở đẳng cấp cho một phương pháp nói rằng cách gọi nó với một số âm sẽ ném một ngoại lệ, sau đó bất kỳ lớp được thừa kế hợp pháp nên ném ngoại lệ tương tự nếu phương pháp của nó được thông qua một số âm. Tuy nhiên, nếu hợp đồng cơ sở chỉ đơn giản nói rằng một phương thức không được gọi với số âm mà không xác định điều gì sẽ xảy ra nếu có, thì một lớp cơ sở có thể làm bất cứ thứ gì nó thích mà không phá vỡ hợp đồng đó.

Mặc dù có vẻ không đủ điều kiện để hành vi của lớp không được chỉ định, việc thêm các đối tượng vào lớp trong khi vẫn tương thích hướng lên trên đòi hỏi phải thay đổi hành vi không xác định. Trong một số trường hợp, một "không xác định" hành vi trên một lớp có thể là "thất bại trong việc biên dịch", nhưng không có đảm bảo rằng mã cố gắng sử dụng một thành viên đó sẽ luôn luôn thất bại trong việc biên dịch. Ví dụ, nếu hợp đồng của một lớp làm cho không có đề cập đến một thành viên "Foo", cố gắng sử dụng một thành viên đó có khả năng sẽ gây ra một lỗi biên dịch, nhưng một phiên bản tương lai của lớp có thể định nghĩa Foo mà không vi phạm hợp đồng của mình.

-2

Bạn đang hoàn toàn đúng. Điều kiện tiên quyết không thể bị suy yếu. Điều này cũng sẽ thay đổi hành vi của loại cơ sở. Ví dụ:

class Base { void method(int x) { /* x: 1-100 allowed else exception */ } } 
class Weak: Base { void method(int x) { /* x: 1-1000 allowed else exception */ } } 
class Strong: Base { void method(int x) { /* x: 1-10 allowed else exception */ } } 

int Main() { 
    Base base = new Base(); 
    base.method(101-1000); // exception 

    Base base2 = new Weak(); 
    base2.method(101-1000); // ok 

    Base base3 = new Strong(); 
    base3.method(101-1000); // exception 
} 

LSP rõ ràng bị vi phạm: Lớp yếu cho 101-1000 ok, nhưng Lớp cơ sở cho 101-1000 ném ngoại lệ. Điều này rõ ràng không phải là hành vi tương tự.LSP hy vọng, tập hợp các số cho lớp cơ sở có thể được mở rộng (tăng cường) trong các lớp con, nhưng trong chương trình chính, bộ sẽ không được mở rộng và do đó lớp con với điều kiện tiên quyết yếu hơn có thể lấp đầy các điều kiện tiên quyết của lớp cơ sở. .

Tương tự như vậy đối với các điều kiện postconditions theo cách khác.

+1

Không có ý nghĩa khi so sánh hành vi của lớp cơ sở so với lớp phụ nếu bạn vi phạm hợp đồng (1-100) của lớp cơ sở ở địa điểm đầu tiên. LSP chỉ áp dụng trong đặc tả của lớp cơ sở. Out-of-specification là hành vi không xác định. – keyoxy

-1

LSP có nghĩa là bạn sẽ có thể thay thế lớp cơ sở bằng lớp con cho các giá trị đầu vào trong đặc tả. Nó không có ý nghĩa để so sánh hành vi của lớp cơ sở so với lớp con khi bạn vi phạm hợp đồng của lớp cơ sở ở vị trí đầu tiên (bạn không giao dịch với sự thay thế thực nếu bạn làm).

(Vi phạm hợp đồng là hành vi không rõ, nó chỉ xảy ra rằng cách tiếp cận phổ biến nhất là để ném một ngoại lệ.)

Về tăng cường các hậu điều, tôi không thấy điểm của bạn, thực sự (?) Nếu hợp đồng là chỉ định các giá trị 1-10, bất kỳ giá trị nào trong khoảng 1-10 đều là đặc điểm kỹ thuật, cũng là 2-9 hoặc thậm chí 3 luôn luôn (?)

0

Xin lỗi, nhưng bạn có lỗi logic trong các cân nhắc của mình.

lớp cơ sở hậu điều kiện đảm bảo rằng giá trị trả về của một phương pháp sẽ nằm trong phạm vi 1-10, nhưng sau đó thay đổi kiểu phụ hậu điều kiện để chỉ cho phép giá trị trả về là trong phạm vi 2-9.

Kể từ mã số hoạt động trong phạm vi 1-10 và dao động 2-9 thực sự là trong phạm vi 1-10, strenghtening các hậu nên không bao giờ là một vấn đề.

Tương tự với việc làm suy yếu các điều kiện tiên quyết. Việc cho phép loại phụ chấp nhận phạm vi lớn hơn không vi phạm hành vi của loại cơ sở. Vì hành vi này chỉ được giới thiệu trong loại phụ và chỉ là điều kiện tiên quyết cho các phương thức của loại phụ.