สมมติว่าเรามีรายการของเอนทิตีงานและ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
เริ่มโยนข้อยกเว้น (อาจจัดการ) นี่เป็นเรื่องใหญ่!