Diyelim ki bir Görev varlıkları listesi ve bir ProjectTask
alt tür var. Görevler, ProjectTasks
Başlama statüsüne sahip olduklarında kapatılamaz olmaları haricinde, herhangi bir zamanda kapatılabilir. Kullanıcı Arabirimi, bir başlatmayı kapatma seçeneğinin ProjectTask
hiçbir zaman kullanılabilir olmadığından emin olmalıdır , ancak alanda bazı güvenlik önlemleri vardır:
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();
}
}
Şimdi Close()
bir Görevi çağırırken , başlangıç ProjectTask
durumuna sahipse, bir temel Görev olmasaydı aramanın başarısız olması ihtimali var . Ancak bu iş gereksinimleridir. Başarısız olmalı. Bu Liskov ikame ilkesinin ihlali olarak kabul edilebilir mi?
public Status Status { get; private set; }
:; Aksi takdirde, Close()
yöntem çalışılabilir.
Task
türlerinin polimorfik kodda tuhaf uyumsuzluklar ortaya koymadığından emin olmak sadece bilmesi Task
gereken bir şeydir. LSP bir heves değil, büyük sistemlerde sürdürülebilirliği sağlamak için tam olarak tanıtıldı.
TaskCloser
sürecin olduğunu hayal edin closesAllTasks(tasks)
. Bu süreç açıkça istisnalar yakalamaya çalışmıyor; ne de olsa, bu açık sözleşmenin bir parçası değil Task.Close()
. Şimdi ProjectTask
aniden TaskCloser
(muhtemelen işlenmemiş) istisnalar atmaya başlarsınız. Bu büyük bir anlaşma!