Katakanlah kita memiliki daftar entitas Tugas, dan ProjectTask
sub tipe. Tugas dapat ditutup kapan saja, kecuali ProjectTasks
yang tidak dapat ditutup setelah status Mulai. UI harus memastikan opsi untuk menutup permulaan ProjectTask
tidak pernah tersedia, tetapi beberapa perlindungan ada dalam domain:
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();
}
}
Sekarang ketika memanggil Close()
suatu Tugas, ada kemungkinan panggilan akan gagal jika itu adalah ProjectTask
dengan status yang dimulai, ketika itu tidak akan jika itu adalah Tugas dasar. Tetapi ini adalah persyaratan bisnis. Itu harus gagal. Bisakah ini dianggap sebagai pelanggaran prinsip substitusi Liskov ?
public Status Status { get; private set; }
:; jika tidak, Close()
metode ini dapat diselesaikan.
Task
tidak memperkenalkan ketidakcocokan yang aneh dalam kode polimorfik yang hanya diketahui Task
adalah masalah besar. LSP bukan kemauan, tetapi diperkenalkan justru untuk membantu pemeliharaan dalam sistem besar.
TaskCloser
proses yang closesAllTasks(tasks)
. Proses ini jelas tidak berusaha menangkap pengecualian; setelah semua, itu bukan bagian dari kontrak eksplisit Task.Close()
. Sekarang Anda memperkenalkan ProjectTask
dan tiba-tiba Anda TaskCloser
mulai melempar (mungkin tidak ditangani) pengecualian. Ini masalah besar!