Angenommen, wir haben eine Liste von Aufgabenentitäten und einen ProjectTask
Untertyp. Aufgaben können jederzeit geschlossen werden, es sei denn ProjectTasks
, sie können nicht geschlossen werden, sobald sie den Status Gestartet haben. Die Benutzeroberfläche sollte sicherstellen, dass die Option zum Schließen eines gestarteten ProjectTask
Objekts niemals verfügbar ist. In der Domäne sind jedoch einige Sicherheitsvorkehrungen vorhanden:
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();
}
}
Wenn Sie nun Close()
eine Aufgabe aufrufen , besteht die Möglichkeit, dass der Anruf fehlschlägt, wenn er ProjectTask
den Status "Gestartet" hat, während dies bei einer Basisaufgabe nicht der Fall wäre. Dies sind jedoch die geschäftlichen Anforderungen. Es sollte scheitern. Kann dies als Verstoß gegen das Liskov-Substitutionsprinzip angesehen werden ?
public Status Status { get; private set; }
:; Andernfalls kann die Close()
Methode umgangen werden.
Task
keine bizarren Inkompatibilitäten in polymorphen Code einführen, von denen nur bekannt Task
ist. LSP ist keine Laune, sondern wurde speziell eingeführt, um die Wartbarkeit in großen Systemen zu verbessern.
TaskCloser
Prozess, der closesAllTasks(tasks)
. Dieser Prozess versucht offensichtlich nicht, Ausnahmen zu erfassen. es ist schließlich nicht Bestandteil des ausdrücklichen Vertrages von Task.Close()
. Jetzt stellst du vor ProjectTask
und plötzlich TaskCloser
beginnt dein Auslösen von (möglicherweise unbehandelten) Ausnahmen. Das ist eine große Sache!