Lập trình là về công việc
Tôi nghĩ cách dễ nhất để trả lời điều này là hiểu được tiến bộ mà OOP đã đạt được trong những năm qua. Tất cả mọi thứ được thực hiện trong OOP (và hầu hết các mô hình lập trình, cho vấn đề đó) được mô hình hóa xung quanh cần thực hiện công việc .
Mỗi khi một phương thức được gọi, người gọi sẽ nói "Tôi không biết làm công việc này, nhưng bạn biết làm thế nào, vì vậy bạn làm điều đó cho tôi."
Điều này đưa ra một khó khăn: điều gì xảy ra khi phương thức được gọi thường biết cách thực hiện công việc, nhưng không phải lúc nào cũng vậy? Chúng tôi cần một cách để giao tiếp "Tôi muốn giúp bạn, tôi thực sự đã làm, nhưng tôi không thể làm điều đó."
Một phương pháp ban đầu để truyền đạt điều này là chỉ cần trả về giá trị "rác". Có thể bạn mong đợi một số nguyên dương, vì vậy phương thức được gọi trả về một số âm. Một cách khác để thực hiện điều này là đặt giá trị lỗi ở đâu đó. Thật không may, cả hai cách đều dẫn đến mã soạn sẵn cho phép tôi kiểm tra mã ở đây để đảm bảo mọi thứ chắc chắn hơn . Khi mọi thứ phát triển phức tạp hơn, hệ thống này sụp đổ.
Một sự tương tự đặc biệt
Giả sử bạn có một thợ mộc, thợ sửa ống nước và thợ điện. Bạn muốn thợ sửa ống nước để sửa bồn rửa của bạn, vì vậy anh ấy hãy xem nó. Sẽ không hữu ích nếu anh ta chỉ nói với bạn, "Xin lỗi, tôi không thể sửa nó. Nó bị hỏng rồi." Chết tiệt, thậm chí còn tệ hơn nếu anh ta nhìn, bỏ đi và gửi cho bạn một lá thư nói rằng anh ta không thể sửa nó. Bây giờ bạn phải kiểm tra thư của mình trước khi bạn biết anh ấy không làm những gì bạn muốn.
Những gì bạn muốn là để anh ấy nói với bạn, "Hãy nhìn xem, tôi không thể sửa nó bởi vì có vẻ như máy bơm của bạn không hoạt động."
Với thông tin này, bạn có thể kết luận bạn muốn thợ điện xem xét vấn đề. Có lẽ thợ điện sẽ tìm thấy một cái gì đó liên quan đến thợ mộc, và bạn sẽ cần thợ mộc sửa nó.
Heck, bạn có thể thậm chí không biết bạn cần một thợ điện, bạn có thể không biết người mà bạn cần. Bạn chỉ là quản lý cấp trung trong một doanh nghiệp sửa chữa nhà, và trọng tâm của bạn là hệ thống ống nước. Vì vậy, bạn nói với ông chủ của bạn về vấn đề, và sau đó ông nói với thợ điện để khắc phục nó.
Đây là những gì ngoại lệ đang mô hình hóa: các chế độ thất bại phức tạp theo kiểu tách rời. Thợ sửa ống nước không cần biết về thợ điện - anh ta thậm chí không cần biết rằng ai đó lên dây chuyền có thể khắc phục vấn đề. Anh ấy chỉ báo cáo về vấn đề anh ấy gặp phải.
Vậy ... một mô hình chống?
Ok, vì vậy hiểu được điểm của ngoại lệ là bước đầu tiên. Tiếp theo là để hiểu thế nào là một mô hình chống.
Để đủ điều kiện là một mô hình chống, nó cần phải
- giải quyết vấn đề
- có hậu quả chắc chắn tiêu cực
Điểm đầu tiên dễ dàng được đáp ứng - hệ thống hoạt động, phải không?
Điểm thứ hai là stickier. Lý do chính cho việc sử dụng các ngoại lệ như luồng điều khiển thông thường là xấu là vì đó không phải là mục đích của chúng. Bất kỳ phần chức năng nhất định nào trong một chương trình nên có mục đích tương đối rõ ràng và việc đồng ý chọn mục đích đó dẫn đến sự nhầm lẫn không cần thiết.
Nhưng đó không phải là tác hại dứt khoát . Đó là một cách kém để làm mọi thứ, và kỳ lạ, nhưng một mô hình chống? Không. Chỉ là ... lẻ.