Trong vài năm qua, các ngôn ngữ tôi muốn sử dụng ngày càng trở nên "chức năng" hơn. Bây giờ tôi sử dụng các ngôn ngữ là một loại "lai": C #, F #, Scala. Tôi thích thiết kế ứng dụng của mình bằng các lớp tương ứng với các đối tượng miền và sử dụng các tính năng chức năng trong đó điều này giúp mã hóa dễ dàng hơn, trùng khớp hơn và an toàn hơn (đặc biệt là khi hoạt động trên các bộ sưu tập hoặc khi truyền chức năng).
Tuy nhiên, hai thế giới "đụng độ" khi đến với các mẫu thiết kế. Ví dụ cụ thể mà tôi phải đối mặt gần đây là mẫu Observer. Tôi muốn nhà sản xuất thông báo cho một số mã khác ("người tiêu dùng / người quan sát", giả sử bộ lưu trữ DB, bộ ghi, v.v.) khi một mục được tạo hoặc thay đổi.
Ban đầu tôi đã làm nó "chức năng" như thế này:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Nhưng bây giờ tôi đang tự hỏi liệu tôi có nên sử dụng cách tiếp cận "OO" hơn không:
interface IItemObserver {
onNotify(Item)
}
class DBObserver : IItemObserver ...
class LogObserver: IItemObserver ...
producer.addObserver(new DBObserver)
producer.addObserver(new LogObserver)
producer.foo() //calls observer in a loop
Đó là pro và con của hai cách tiếp cận? Tôi đã từng nghe một chuyên gia về FP nói rằng các mẫu thiết kế chỉ tồn tại vì những hạn chế của ngôn ngữ và đó là lý do tại sao có rất ít ngôn ngữ chức năng. Có lẽ đây có thể là một ví dụ về nó?
EDIT: Trong kịch bản cụ thể của tôi, tôi không cần nó, nhưng .. bạn sẽ thực hiện loại bỏ và thêm "quan sát viên" theo cách chức năng như thế nào? (Tức là làm thế nào bạn sẽ thực hiện tất cả các chức năng trong mẫu?) Chỉ cần chuyển một chức năng mới, ví dụ?