การเสริมความแข็งแกร่งของปัจจัยพื้นฐานและความอ่อนแอของ postconditions จะละเมิดหลักการทดแทน Liskov อย่างไร


19

ฉันอ่านว่าหลักการทดแทนของ Liskovถูกละเมิดหาก:

  1. เงื่อนไขเบื้องต้นมีความเข้มแข็งหรือ

  2. Postconditions จะอ่อนแอลง

แต่ฉันยังไม่เข้าใจว่าจุดสองจุดนี้จะละเมิดหลักการเปลี่ยนตัว Liskov อย่างไร บางคนได้โปรดอธิบายด้วยตัวอย่าง โดยเฉพาะอย่างยิ่งหนึ่งในเงื่อนไขข้างต้นจะทำให้สถานการณ์ที่วัตถุ subclass ไม่สามารถทดแทนสำหรับวัตถุ superclass ได้อย่างไร

คำตอบ:


29
  1. สมมติว่า baseclass ของคุณทำงานกับสมาชิก int ตอนนี้ชนิดย่อยของคุณต้องการให้ int เป็นค่าบวก นี่คือเงื่อนไขล่วงหน้าที่แข็งแกร่งขึ้นและตอนนี้โค้ดใด ๆ ที่ทำงานได้ดีอย่างสมบูรณ์ก่อนด้วย ints เชิงลบจะถูกทำลาย

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

ตัวอย่างเหล่านี้เป็นเพียงตัวอย่างเล็กน้อย แต่มีแนวคิดอยู่ สิ่งที่ต้องการออกจากการเชื่อมต่อไฟล์ / ฐานข้อมูลเปิดเป็นตัวอย่างของการโพสต์เงื่อนไขที่ปลดเปลื้องที่นำไปสู่ปัญหา


1

ป้อนคำอธิบายรูปภาพที่นี่

Invariant - เทมเพลตของ SelfDrivingVehicle ซึ่งยังคงไม่เปลี่ยนแปลงในทุกประเภทย่อยเช่นลำดับที่มันดำเนินการพฤติกรรมที่แทนที่ไปถึงปลายทาง

ให้สมมติอีกหนึ่งวิธีที่นี่

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

Precondition - SelfDriveVehicle ประเภท Base ไม่มียานพาหนะในมัน (ที่นี่บริบทคือ Add) และใน Weakened Precondition ที่ไม่สามารถแก้ไขได้ด้วยประเภทย่อยใด ๆ โดยการเปลี่ยนยานพาหนะคุณสมบัติและเสริมสร้างมันอย่างชัดเจน ประเภทย่อยใด ๆ อาจเรียกใช้เพิ่มได้เท่านั้น

Postcondition - เมื่อ Add ถูกเรียกใช้ Base Type นั้นจะอยู่ใน Postcondition ที่เพิ่มความแข็งแกร่งซึ่งไม่สามารถทำให้อ่อนแอลงได้ด้วยการเปลี่ยนค่าของยานพาหนะ

สถานะของประเภทฐานกลับมาสู่สถานะดั้งเดิมเมื่อมีการเรียกใช้พฤติกรรมการเพิ่ม


-1

ตัวอย่างนี้ถูกทุบตีจนแทบตาย แต่ให้พิจารณาถึงความเป็นไปได้ของสแควร์ / สี่เหลี่ยมผืนผ้าหรือวงกลม / วงรี สมมติว่าคุณมีสี่เหลี่ยมผืนผ้าระดับฐานที่กำหนดวัตถุที่มีความยาวและความกว้าง หากคุณมีคลาส Square ที่สืบทอดคลาส Rectangle มันจะมีกฎใน setter / getter ซึ่งจะต้องมีการเปลี่ยนแปลงความยาวหรือความกว้างใด ๆ ที่จะเปลี่ยนคู่ของมัน ข้อกำหนดด้านมิติเหล่านี้เสริมความแข็งแกร่งให้กับเงื่อนไขล่วงหน้าเนื่องจากสี่เหลี่ยมผืนผ้าที่แทนที่ด้วยสี่เหลี่ยมจัตุรัสจะหายไปข้อกำหนดด้านมิติเหล่านี้ สมมติว่าคุณย้อนกลับการสืบทอดเพื่อให้สี่เหลี่ยมผืนผ้าสืบทอดสแควร์คุณจะอ่อนกำลังลงของเงื่อนไขการโพสต์โดยการผ่อนคลายข้อกำหนดด้านมิติเพื่อให้สี่เหลี่ยมผืนผ้าทำงานได้อย่างอิสระ

อย่างไรก็ตามหากคุณต้องการลบความสามารถในการเปลี่ยนมิติหลักการการแทนที่จะเก็บไว้เพราะหากไม่มีสี่เหลี่ยมผืนผ้าหรือสี่เหลี่ยมจัตุรัสอาจเปลี่ยนมิติได้ ทั้งสองมีความยาวทั้งสองมีความกว้างและไม่สามารถเปลี่ยนค่าเหล่านั้นได้

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


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