Task 엔터티 목록과 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
다형성 코드에서 기괴한 비 호환성을 유발하지 않도록 Task
하는 것은 큰 문제입니다. LSP는 변덕스럽지 않지만 대규모 시스템에서 유지 관리를 돕기 위해 정확하게 도입되었습니다.
TaskCloser
어떤 프로세스 가 있다고 상상해보십시오 closesAllTasks(tasks)
. 이 프로세스는 분명히 예외를 잡으려고 시도하지 않습니다. 결국,의 명시 적 계약의 일부가 아닙니다 Task.Close()
. 이제 당신은 ProjectTask
갑자기 TaskCloser
예외를 던지기 시작했을 것입니다. 이것은 큰 문제입니다!