Dalam beberapa tahun terakhir, bahasa yang saya suka gunakan menjadi semakin "fungsional". Saya sekarang menggunakan bahasa yang merupakan semacam "hibrid": C #, F #, Scala. Saya suka merancang aplikasi saya menggunakan kelas yang sesuai dengan objek domain, dan menggunakan fitur fungsional di mana ini membuat pengkodean lebih mudah, lebih bertepatan dan lebih aman (terutama ketika beroperasi pada koleksi atau ketika melewati fungsi).
Namun kedua dunia "bentrok" ketika datang ke pola desain. Contoh spesifik yang saya hadapi baru-baru ini adalah pola Observer. Saya ingin produser memberi tahu beberapa kode lain ("konsumen / pengamat", katakanlah penyimpanan DB, logger, dan sebagainya) ketika suatu item dibuat atau diubah.
Saya awalnya melakukannya "secara fungsional" seperti ini:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Tapi sekarang saya bertanya-tanya apakah saya harus menggunakan pendekatan yang lebih "OO":
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
Apa pro dan kontra dari kedua pendekatan tersebut? Saya pernah mendengar seorang guru FP mengatakan bahwa pola desain ada hanya karena keterbatasan bahasa, dan itulah sebabnya ada begitu sedikit dalam bahasa fungsional. Mungkin ini bisa menjadi contohnya?
EDIT: Dalam skenario khusus saya, saya tidak membutuhkannya, tapi .. bagaimana Anda menerapkan penghapusan dan penambahan "pengamat" dengan cara fungsional? (Yaitu bagaimana Anda menerapkan semua fungsionalitas dalam pola?) Baru saja melewati fungsi baru, misalnya?