มีชื่อเฉพาะสำหรับบุคคลที่ผิดธรรมดา“ Square ที่สืบทอดมาจาก Rectangle” หรือไม่?


18

ความล้มเหลวบางอย่างของ OOP แสดงขึ้นพร้อมกับคลาส Square ที่สืบทอดมาจาก Rectangle โดยที่ Logical Square เป็นความเชี่ยวชาญเฉพาะของ Rectangle และควรสืบทอดมาจากมัน แต่ทุกอย่างจะแยกจากกันเมื่อคุณพยายามเปลี่ยนความยาวหรือความกว้างของ Square

มีคำเฉพาะสำหรับการอธิบายสิ่งที่เกิดขึ้นกับกรณีนี้หรือไม่?


2
คุณช่วยอธิบายหน่อยได้ไหมว่า ฉันไม่เข้าใจสิ่งที่คุณหมายถึง
ริ้น

1
สมมติว่ารูปสี่เหลี่ยมผืนผ้ามีวิธีการเสมือนจริงที่อนุญาตให้มีการตั้งค่าขนาดโดยการส่งผ่านความยาวและความกว้างการตั้งค่าความยาวและความกว้างที่แตกต่างกันในสี่เหลี่ยมสามารถส่งกลับสี่เหลี่ยมและการตั้งค่าความยาวและความกว้างเดียวกันบนสี่เหลี่ยม รหัสใด ๆ ที่จำเป็นต้องรู้สแควร์อย่างชัดเจนสามารถพยายามที่จะส่งไปยังสแควร์ ฉันไม่เห็นว่ามีความล้มเหลว ...

8
นี่ไม่ใช่ความขัดแย้ง นี่เป็นกรณีของการสร้างแบบจำลองที่ไม่เหมาะสมของโดเมนปัญหา ลำดับชั้นการสืบทอดไม่จำเป็นต้องสอดคล้องกับลำดับชั้นของสิ่งของในโดเมนปัญหา เป็นเรื่องที่ดีเมื่อทำ แต่เคล็ดลับในแบบจำลองที่ดีคือการเข้าใจว่าคุณต้องทำอะไรที่แตกต่างจากโลกแห่งความจริง
Michael Kohne

1
FWIW: โดยเฉพาะอย่างยิ่งปัญหาคืออินเตอร์เฟสการอ่านและการเขียนไม่ตรงกัน คือคุณสามารถอ่านวงกลมเป็นความเชี่ยวชาญพิเศษของวงรีได้ แต่เขียนวงรีเป็นความเชี่ยวชาญเฉพาะของวงกลมเท่านั้น
Macke

1
@ แกรนด์มาสเตอร์ B ฉันไปโดย "บุคคลใดสิ่งหนึ่งหรือสถานการณ์ที่แสดงให้เห็นถึงลักษณะที่ขัดแย้งกันอย่างเห็นได้ชัด" ความขัดแย้งคือถ้าสี่เหลี่ยมมีคุณสมบัติแตกต่างกันเราต้องพูดว่า "a Square ไม่ใช่รูปสี่เหลี่ยมผืนผ้า" เมื่อความจริงที่ว่าเราคาดว่า Square จะเป็นชนิดย่อยของรูปสี่เหลี่ยมผืนผ้า อาจไม่มีแอปพลิเคชันจริงที่จะมีประเภทสี่เหลี่ยมผืนผ้าและสี่เหลี่ยมมันเป็นเพียงนามธรรมเพื่อแสดงให้เห็นถึงปัญหาบางอย่างที่สามารถปรากฏในกระบวนทัศน์ระดับชั้นเรียน
วิกเตอร์

คำตอบ:


27

วิกิพีเดียอ้างถึงว่าเป็นปัญหาของวง - วงรี

ปัญหาวงกลมวงรีในการพัฒนาซอฟต์แวร์ (บางครั้งเรียกว่าปัญหาตารางสี่เหลี่ยม ) แสดงให้เห็นถึงจำนวนของข้อผิดพลาดซึ่งสามารถเกิดขึ้นเมื่อมีการใช้หลายรูปแบบชนิดย่อยในการสร้างแบบจำลองวัตถุ ปัญหาที่พบบ่อยที่สุดเมื่อใช้การเขียนโปรแกรมเชิงวัตถุ

นี่คือ L ในตัวย่อที่SOLIDซึ่งเป็นที่รู้จักกันในหลักการทดแทน Liskov ปัญหานี้เกิดขึ้นจากการละเมิดหลักการดังกล่าว

ปัญหาเกี่ยวข้องกับความสัมพันธ์ย่อยหรือการสืบทอดที่ควรมีอยู่ระหว่างคลาสที่แสดงถึงวงกลมและจุดไข่ปลา (หรือในทำนองเดียวกันสี่เหลี่ยมและสี่เหลี่ยม) โดยทั่วไปปัญหาแสดงให้เห็นถึงความยากลำบากที่สามารถเกิดขึ้นได้เมื่อชั้นฐานมีวิธีการที่กลายพันธุ์วัตถุในลักษณะที่อาจทำให้ค่าคงที่ (แข็งแกร่ง) ที่พบในชั้นเรียนกลายเป็นโมฆะทำให้หลักการแทน Liskov ถูกละเมิด ...


1
และจากการอ่านวิกิพีเดียกล่าวถึงคำอธิบายทางวิชาการว่า "[การละเมิด] หลักการการทดแทน Liskov" ขอบคุณ :)
ชนะ

1
มันเป็นแค่การละเมิดขึ้นอยู่กับว่าคุณมองอย่างไร โดยส่วนตัววงการทั้งหมดเป็นรูปวงรี ไม่มีการละเมิด จะเริ่มมีการละเมิดหากวิธีการของวงรีกลายเป็นข้อ จำกัด จากนั้นในสถานการณ์นั้นวงกลมจะไม่สามารถเป็นประเภทย่อยของสัญญาวงรีนั้น
Mark Canlas

6
@MarkCanlas ปัญหาไม่สามารถฝ่าฝืนหลักการการทดแทน Liskov ได้ มันอาจไม่ใช่การละเมิดหลักการอื่น ๆ แต่ไม่มีใครอ้างว่า เมื่อปัญหาไม่เกิดขึ้นเนื่องจากสัญญาไม่รวมค่าคงที่ใด ๆ ที่จะใช้งานไม่ได้ (แม้ว่าฉันจะไม่ได้จินตนาการถึงรูปแบบที่มีประโยชน์ซึ่งเป็นเรื่องจริง) อาจไม่มีการละเมิด LSP แต่นั่นไม่ได้หมายความว่าปัญหาเมื่อมันเกิดขึ้นไม่ได้เกิดจากการละเมิด LSP

7
@ Mark Canlas: ไม่วงกลมคงที่เป็นวงรีคงที่วงกลมที่ไม่แน่นอนไม่ได้เป็นวงรีที่ไม่แน่นอน ในการคำนวณค่าคงที่ทางเรขาคณิตคุณไม่สามารถเปลี่ยนวงรีได้คุณสามารถใช้วงรีอื่นได้
maxim1000

1
ข้อ จำกัด ด้านประวัติศาสตร์ / กฎของหลักการทดแทน Liskov กล่าวว่าเมื่อชนิดย่อยเพิ่มวิธีการใหม่วิธีการเหล่านั้นจะไม่ได้รับอนุญาตให้จัดการสถานะของวัตถุในลักษณะที่จะสร้างประวัติศาสตร์ (เช่นชุดของรัฐ) ที่ไม่ได้ อนุญาตใน supertype เช่นคุณไม่สามารถสร้าง subtype ของ mutable ที่ไม่เปลี่ยนรูปได้เพราะเมื่อมีการจัดการผ่านวิธีของ supertype สถานะจะเหมือนกันเสมอในขณะที่เมื่อจัดการผ่านทาง mutator method ของ subtype สถานะจะเปลี่ยนไป นั่นคือประวัติศาสตร์ที่ไม่อนุญาตให้ใช้โดยซุปเปอร์ประเภท
Jörg W Mittag


8

ในระดับพื้นฐานมากกว่าหลักการทดแทน Liskov นี่เป็นข้อผิดพลาดหมวดหมู่หรือข้อผิดพลาดหมวดหมู่

ในบริบทของพฤติกรรมการสร้างแบบจำลองสแควร์ก็ไม่ใช่ประเภทของรูปสี่เหลี่ยมผืนผ้า

เมื่อคุณตระหนักถึงปัญหานี้จะหายไปนับตั้งแต่การสันนิษฐานเบื้องต้น (สี่เหลี่ยมจัตุรัสเป็นประเภทสี่เหลี่ยมจัตุรัส) ถูกลบออกจากการเล่น

ปัญหาที่เกิดขึ้นกับคำตอบนี้ก็คือเนื่องจากโรงเรียนมีการเจาะลงไปในทุกคนที่ทำรูปทรงเรขาคณิตที่สี่เหลี่ยมเป็นรูปสี่เหลี่ยมผืนผ้าชนิดหนึ่ง แต่มันสำคัญมากที่จะต้องเข้าใจว่าสิ่งนี้เป็นจริงในบริบทที่เฉพาะเจาะจงเท่านั้น (การจำแนกประเภทของรูปทรงเรขาคณิตตามคุณสมบัติของมุมภายใน) ในแง่ของพฤติกรรมสี่เหลี่ยมไม่ได้เป็นสี่เหลี่ยม หากต้องการดูการจำแนกประเภทหนึ่งชุดในบริบทที่ไม่ถูกต้องเป็นความผิดพลาดประเภท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.