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
状態の場合は呼び出しが失敗する可能性がありますが、ベースのタスクの場合は失敗しません。しかし、これはビジネス要件です。失敗するはずです。これは、リスコフ代替原理の違反とみなすことができますか?
public Status Status { get; private set; }
ます。それ以外の場合、Close()
メソッドは回避できます。
Task
多相コードに奇妙な非互換性を導入しないようにすることTask
は、大したことです。LSPは気まぐれではありませんが、大規模システムの保守性を高めるために正確に導入されました。
TaskCloser
プロセスがあると想像してくださいclosesAllTasks(tasks)
。このプロセスは明らかに例外をキャッチしようとしません。結局のところ、それはの明示的な契約の一部ではありませんTask.Close()
。これでProjectTask
、突然TaskCloser
(おそらく未処理の)例外がスローされ始めます。これは大したことです!