Có một tên cụ thể nào cho Quảng trường của Di sản thừa kế từ nghịch lý Hình chữ nhật không?


18

Một thất bại nhất định của OOP được hiển thị với Quảng trường lớp kế thừa từ Hình chữ nhật, trong đó Quảng trường logic là chuyên môn của Hình chữ nhật và do đó nên thừa hưởng từ nó, nhưng mọi thứ sẽ sụp đổ khi bạn cố gắng thay đổi chiều dài hoặc chiều rộng của Hình vuông.

Có một thuật ngữ cụ thể để mô tả những gì đang xảy ra với trường hợp đó?


2
bạn có thể vui lòng giải thích chính xác những gì "đang đi sai"? Tôi không hiểu ý của bạn
gnat

1
Giả sử hình chữ nhật có một phương thức ảo cho phép người ta đặt kích thước bằng cách chuyển chiều dài và chiều rộng, đặt chiều dài và chiều rộng khác nhau trên hình vuông có thể trả về hình chữ nhật và đặt cùng chiều dài và chiều rộng trên hình chữ nhật có thể trả về hình vuông. Bất kỳ mã nào cần biết rõ ràng vuông có thể cố gắng chuyển sang một hình vuông. Tôi không thấy làm thế nào có một thất bại ...

8
Đây không phải là một nghịch lý. Đây là một trường hợp mô hình hóa không đúng của miền vấn đề. Hệ thống phân cấp thừa kế KHÔNG nhất thiết phải phù hợp với hệ thống phân cấp của sự vật trong miền vấn đề. Thật tuyệt khi điều đó xảy ra, nhưng mẹo trong một mô hình tốt là hiểu nơi bạn cần làm những điều khác biệt so với thế giới thực.
Michael Kohne

1
FWIW: Cụ thể hơn, vấn đề là giao diện đọc và viết không khớp nhau. Tức là bạn có thể đọc một vòng tròn như một chuyên môn của một hình elip, nhưng chỉ viết một hình elip như một chuyên môn của một hình tròn.
Macke

1
@GrandmasterB Tôi đi theo "bất kỳ người nào, sự vật hoặc tình huống thể hiện một bản chất rõ ràng mâu thuẫn." Điều mâu thuẫn là nếu hình vuông có các thuộc tính khác nhau, chúng ta phải nói "Hình vuông không phải là một loại hình chữ nhật", khi thực tế chúng ta mong đợi Square là một kiểu con của Hình chữ nhật. Có lẽ không có ứng dụng thực sự nào có các loại Hình chữ nhật và Hình vuông, đó chỉ là một sự trừu tượng để minh họa một loại vấn đề nhất định có thể xuất hiện trong các mô hình dựa trên lớp.
Victor

Câu trả lời:


27

Wikipedia chỉ đơn thuần gọi nó là vấn đề hình elip

Các vấn đề vòng tròn-hình elip trong phát triển phần mềm (đôi khi được gọi là vấn đề vuông hình chữ nhật ) minh họa một số cạm bẫy mà có thể phát sinh khi sử dụng kiểu phụ đa hình trong mô hình đối tượng. Các vấn đề thường gặp nhất khi sử dụng lập trình hướng đối tượng.

Đây là chữ L trong từ viết tắt RẮN được gọi là nguyên tắc thay thế Liskov . Vấn đề này phát sinh là vi phạm nguyên tắc đó.

Vấn đề liên quan đến việc phân nhóm hoặc kế thừa mối quan hệ nên tồn tại giữa các lớp đại diện cho hình tròn và hình elip (hoặc, tương tự, hình vuông và hình chữ nhật). Tổng quát hơn, vấn đề minh họa những khó khăn có thể xảy ra khi một lớp cơ sở chứa các phương thức làm biến đổi một đối tượng theo cách có thể làm mất hiệu lực bất biến (mạnh hơn) được tìm thấy trong một lớp dẫn xuất, khiến nguyên tắc thay thế Liskov bị vi phạm ...


1
Và, đọc nó, Wikipedia đề cập đến lời giải thích mang tính học thuật hơn là "[vi phạm] nguyên tắc thay thế Liskov". Cảm ơn :)
Victor

1
Chà, đó chỉ là một sự vi phạm tùy thuộc vào cách bạn nhìn vào nó. Cá nhân, tất cả các vòng tròn là hình elip; không có vi phạm. Bắt đầu có sự vi phạm nếu các phương thức cho hình elip trở nên hạn chế. Sau đó, trong kịch bản cụ thể đó, một vòng tròn không thể là một kiểu con của hợp đồng cụ thể đó của hình elip.
Đánh dấu Canlas

6
@MarkCanlas Vấn đề là vi phạm nguyên tắc thay thế Liskov. Nó có thể không vi phạm các nguyên tắc khác, nhưng không ai tuyên bố điều đó. Khi sự cố không xảy ra do các hợp đồng không bao gồm bất kỳ sự bất biến nào sẽ bị phá vỡ (mặc dù tôi không tưởng tượng được một mô hình hữu ích trong trường hợp này là đúng), có thể không có vi phạm LSP, nhưng điều đó không có nghĩa là vấn đề , khi nó xảy ra, không phải do vi phạm LSP.

7
@Mark Canlas: không , hình tròn không đổi là hình elip không đổi , hình tròn có thể thay đổi không phải là hình elip có thể thay đổi. Trong hằng số hình học được giả sử, bạn không thể thay đổi hình elip, bạn có thể lấy hình elip khác
maxim1000

1
Ràng buộc lịch sử / Quy tắc của Nguyên tắc thay thế Liskov nói rằng khi một kiểu con thêm các phương thức mới, các phương thức đó không được phép thao túng trạng thái của đối tượng theo cách mà nó tạo ra một lịch sử (tức là một loạt các trạng thái) không phải là được phép trong siêu kiểu. Ví dụ, bạn không thể tạo một kiểu con của một biến đổi bất biến, bởi vì khi chỉ thao tác thông qua các phương thức của siêu kiểu, trạng thái luôn giống nhau, trong khi đó khi thao tác thông qua các phương thức biến đổi của kiểu con, trạng thái sẽ thay đổi. Đó là một lịch sử không được siêu nhân cho phép.
Jörg W Mittag


8

Ở cấp độ cơ bản hơn Nguyên tắc thay thế Liskov, đây là lỗi danh mục hoặc lỗi danh mục

Trong bối cảnh hành vi mô hình hóa, một hình vuông đơn giản không phải là một loại hình chữ nhật.

Khi bạn nhận ra điều này, vấn đề sẽ bốc hơi kể từ khi giả định ban đầu (hình vuông là một loại hình chữ nhật) bị xóa khỏi trò chơi.

Vấn đề với câu trả lời này là từ khi đi học, nó được khoan vào bất cứ ai làm hình học mà hình vuông là một loại hình chữ nhật. Nhưng điều rất quan trọng là phải hiểu rằng điều này chỉ đúng trong một bối cảnh rất cụ thể (việc phân loại các hình dạng hình học dựa trên các thuộc tính của các góc bên trong của chúng). Về mặt hành vi một hình vuông không phải là một hình chữ nhật. Để xem một bộ phân loại trong bối cảnh sai là một lỗi thể loại.

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.