Скажем, у нас есть список сущностей задач и ProjectTask
подтип. Задачи могут быть закрыты в любое время, кроме тех, ProjectTasks
которые не могут быть закрыты, если они имеют статус Запущено. Пользовательский интерфейс должен гарантировать, что опция закрытия запуска 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
статус «Запущено», а если нет, то если это была базовая Задача. Но это бизнес-требования. Это должно потерпеть неудачу. Можно ли считать это нарушением принципа подстановки Лискова ?
public Status Status { get; private set; }
:; в противном случае Close()
метод можно обойти.
Task
не вносят причудливых несовместимостей в полиморфный код, о котором только известно, Task
- это большая проблема. LSP не прихоть, но был введен именно для того, чтобы облегчить обслуживание в больших системах.
TaskCloser
процесс, который closesAllTasks(tasks)
. Этот процесс явно не пытается перехватить исключения; в конце концов, это не часть явного договора Task.Close()
. Теперь вы вводите ProjectTask
и неожиданно TaskCloser
начинаете генерировать (возможно необработанные) исключения. Это большое дело!