Son birkaç yıldır, kullanmak istediğim diller giderek daha "işlevsel" hale geliyor. Şimdi bir çeşit "melez" olan dilleri kullanıyorum: C #, F #, Scala. Uygulamamı etki alanı nesnelerine karşılık gelen sınıfları kullanarak tasarlamayı ve bunun kodlamayı daha kolay, daha çakışık ve daha güvenli hale getirdiği işlevsel özellikleri kullanmayı seviyorum (özellikle koleksiyonlarda veya işlevleri geçerken).
Ancak iki dünya tasarım desenlerine gelirken “çatışıyor”. Son zamanlarda karşılaştığım özel örnek, Gözlemci modelidir. Bir üreticinin, bir öğe oluşturulduğunda veya değiştirildiğinde başka bir kodu ("tüketiciler / gözlemciler", bir DB depolama alanı, bir kaydedici vb.) Bilgilendirmesini istiyorum.
Başlangıçta böyle "fonksiyonel" yaptı:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Ama şimdi daha "OO" yaklaşımını kullanmam gerekip gerekmediğini merak ediyorum:
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
İki yaklaşımın yanlısı ve olumlu yanları nelerdir? Bir zamanlar bir FP guru'nun tasarım desenlerinin sadece dilin sınırlamaları nedeniyle olduğunu söylediğini duydum ve bu yüzden fonksiyonel dillerde çok az var. Belki bu bir örnek olabilir?
EDIT: Benim özel senaryoda ihtiyacım yok, ama .. fonksiyonel şekilde "gözlemci" kaldırma ve ekleme nasıl? (Yani kalıptaki tüm işlevsellikleri nasıl uygularsınız?) Mesela yeni bir fonksiyon mu geçiyorsunuz?