สมมติว่าเรามีรายการของเอนทิตีงานและProjectTaskประเภทย่อย สามารถปิดงานได้ตลอดเวลายกเว้นงานProjectTasksที่ไม่สามารถปิดได้เมื่อพวกเขามีสถานะเป็นเริ่มต้น UI ควรตรวจสอบให้แน่ใจว่าไม่มีตัวเลือกในการปิดการเริ่มต้นทำงานProjectTaskแต่มีการป้องกันบางอย่างในโดเมน:
public class Task
{
public Status Status { get; set; }
public virtual void Close()
{
Status = Status.Closed;
}
}
public class ProjectTask : Task
{
public override void Close()
{
if (Status == Status.Started)
throw new Exception("Cannot close a started Project Task");
base.Close();
}
}
ตอนนี้เมื่อเรียกClose()ใช้งานมีโอกาสที่การโทรจะล้มเหลวหากเป็นProjectTaskสถานะเริ่มต้นเมื่อไม่เป็นถ้าเป็นภารกิจพื้นฐาน แต่นี่คือข้อกำหนดทางธุรกิจ มันควรจะล้มเหลว สิ่งนี้ถือได้ว่าเป็นการละเมิดหลักการทดแทน Liskovหรือไม่?
public Status Status { get; private set; }; มิฉะนั้นClose()วิธีนี้สามารถแก้ไขได้
Taskไม่แนะนำความไม่ลงรอยกันที่แปลกประหลาดในรหัส polymorphic ที่รู้เพียงเรื่องTaskใหญ่เท่านั้น LSP ไม่ได้ตั้งใจ แต่ถูกนำมาใช้อย่างแม่นยำเพื่อช่วยในการบำรุงรักษาในระบบขนาดใหญ่
TaskCloser closesAllTasks(tasks)เห็นได้ชัดว่ากระบวนการนี้ไม่ได้พยายามยกเว้น Task.Close()หลังจากทั้งหมดมันไม่ได้เป็นส่วนหนึ่งของสัญญาที่ชัดเจนของ ตอนนี้คุณแนะนำProjectTaskและทันใดนั้นคุณก็TaskCloserเริ่มโยนข้อยกเว้น (อาจจัดการ) นี่เป็นเรื่องใหญ่!