Giả sử chúng tôi có một danh sách các thực thể Nhiệm vụ và một ProjectTask
loại phụ. Nhiệm vụ có thể được đóng bất cứ lúc nào, ngoại trừ ProjectTasks
không thể đóng khi chúng có trạng thái Bắt đầu. Giao diện người dùng phải đảm bảo tùy chọn đóng bắt đầu ProjectTask
không bao giờ có sẵn, nhưng một số biện pháp bảo vệ có trong miền:
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();
}
}
Bây giờ khi gọi Close()
vào Nhiệm vụ, có khả năng cuộc gọi sẽ thất bại nếu đó là ProjectTask
trạng thái bắt đầu, khi đó sẽ không thực hiện nếu đó là Nhiệm vụ cơ bản. Nhưng đây là yêu cầu kinh doanh. Nó sẽ thất bại. Điều này có thể được coi là vi phạm nguyên tắc thay thế Liskov không?
public Status Status { get; private set; }
; nếu không Close()
phương pháp có thể được làm việc xung quanh.
Task
con không đưa ra sự không tương thích kỳ quái trong mã đa hình mà chỉ biết Task
là một vấn đề lớn. LSP không phải là một ý thích, nhưng được giới thiệu chính xác để giúp duy trì trong các hệ thống lớn.
TaskCloser
quy trình closesAllTasks(tasks)
. Quá trình này rõ ràng không cố gắng để bắt ngoại lệ; Rốt cuộc, nó không phải là một phần của hợp đồng rõ ràng Task.Close()
. Bây giờ bạn giới thiệu ProjectTask
và đột nhiên bạn TaskCloser
bắt đầu ném ngoại lệ (có thể chưa được xử lý). Đây là một vấn đề lớn!