Làm thế nào để tăng cường các điều kiện tiên quyết và làm suy yếu các điều kiện hậu vi phạm nguyên tắc thay thế Liskov?


19

Tôi đọc rằng nguyên tắc thay thế của Liskov bị vi phạm nếu:

  1. Điều kiện tiên quyết được củng cố, hoặc

  2. Hậu điều bị suy yếu

Nhưng tôi vẫn chưa hiểu đầy đủ về việc hai điểm này sẽ vi phạm nguyên tắc thay thế Liskov như thế nào. Ai đó có thể vui lòng giải thích với một ví dụ. Cụ thể, làm thế nào bất kỳ một trong các điều kiện trên sẽ gây ra tình huống trong đó một đối tượng lớp con không thể được thay thế cho một đối tượng siêu lớp?

Câu trả lời:


29
  1. Giả sử baseclass của bạn hoạt động với một thành viên int. Bây giờ subtype của bạn yêu cầu int phải tích cực. Điều này được củng cố các điều kiện trước, và bây giờ bất kỳ mã nào hoạt động hoàn hảo trước đây với ints âm bị phá vỡ.

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

Tất nhiên đây là những ví dụ tầm thường, nhưng khái niệm này nắm giữ. Những thứ như để mở kết nối tệp / cơ sở dữ liệu là một ví dụ về tình trạng hậu bị nới lỏng dẫn đến các vấn đề.


1

nhập mô tả hình ảnh ở đây

Bất biến - Mẫu của SelfDishingVehicle vẫn không thay đổi trong tất cả các kiểu con, tức là Thứ tự thực hiện các hành vi bị ghi đè để đến đích.

Cho phép Giả sử thêm một phương pháp Tại đây

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Điều kiện tiên quyết - SelfDriveVehicle Loại cơ sở không có phương tiện nào trong đó (ở đây bối cảnh là Thêm) và Điều kiện tiên quyết bị suy yếu không thể thay đổi bởi bất kỳ loại phụ nào bằng cách thay đổi phương tiện bất động sản và Tăng cường rõ ràng. Bất kỳ loại phụ nào chỉ có thể gọi Thêm.

Postcondition - Sau khi Add được gọi Loại cơ sở được tăng cường Postcondition không thể bị suy yếu bởi các loại phụ bằng cách thay đổi giá trị của phương tiện.

Trạng thái Loại cơ sở trở lại Trạng thái ban đầu sau khi Thêm hành vi được gọi.


-1

Ví dụ này bị đánh chết khá nhiều, nhưng hãy xem xét khả năng Hình vuông / Hình chữ nhật hoặc Hình tròn / Hình elip. Giả sử bạn có một Hình chữ nhật lớp cơ sở xác định một đối tượng có chiều dài và chiều rộng. Nếu bạn có một lớp Square kế thừa lớp Hình chữ nhật, nó sẽ có một quy tắc trong setter / getter của nó sẽ yêu cầu bất kỳ thay đổi nào về chiều dài hoặc chiều rộng sẽ thay đổi đối tác của nó. Các yêu cầu về chiều này củng cố các điều kiện trước bởi vì một hình chữ nhật được thay thế cho hình vuông sẽ thiếu các yêu cầu về chiều này. Giả sử bạn đảo ngược sự kế thừa để Hình chữ nhật kế thừa Hình vuông, bạn sẽ làm suy yếu các điều kiện bài bằng cách nới lỏng các yêu cầu về chiều để cho phép Hình chữ nhật hoạt động độc lập.

Tuy nhiên, nếu bạn muốn loại bỏ khả năng thay đổi kích thước, nguyên tắc thay thế sẽ được giữ bởi vì nếu cả Hình chữ nhật và Hình vuông không thể thay đổi kích thước, thì chúng có các điều kiện trước và sau bằng nhau bất kể sự kế thừa. Cả hai đều có chiều dài, cả hai đều có chiều rộng và không thể thay đổi các giá trị đó.

ref: Wikipedia - http://en.wikipedia.org/wiki/Liskov_substlation_principl


1
Thật không may, ví dụ đó không có gì để làm với xác minh chính thức. Không có hợp đồng.
Frank Hileman
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.