ในช่วงไม่กี่ปีที่ผ่านมาภาษาที่ฉันชอบใช้นั้นเพิ่มมากขึ้น ตอนนี้ฉันใช้ภาษาที่เป็น "ลูกผสม": C #, F #, Scala ฉันชอบที่จะออกแบบแอปพลิเคชันของฉันโดยใช้คลาสที่สอดคล้องกับวัตถุโดเมนและใช้คุณสมบัติการทำงานที่ทำให้การเขียนรหัสง่ายขึ้นตรงและปลอดภัยยิ่งขึ้น (โดยเฉพาะอย่างยิ่งเมื่อทำงานกับคอลเลกชัน
อย่างไรก็ตามทั้งสองโลก "ปะทะกัน" เมื่อมาถึงรูปแบบการออกแบบ ตัวอย่างเฉพาะที่ฉันเผชิญเมื่อเร็ว ๆ นี้คือรูปแบบการสังเกตการณ์ ฉันต้องการให้ผู้ผลิตแจ้งรหัสอื่น ๆ ("ผู้บริโภค / ผู้สังเกตการณ์" พูดที่เก็บข้อมูล DB ตัวบันทึกและอื่น ๆ ) เมื่อรายการถูกสร้างหรือเปลี่ยนแปลง
ตอนแรกฉันทำมัน "ตามหน้าที่" เช่นนี้:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
แต่ตอนนี้ฉันสงสัยว่าฉันควรใช้วิธีการ "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
ข้อดีข้อเสียของสองวิธีนี้คืออะไร? ฉันเคยได้ยินปรมาจารย์ FP บอกว่ารูปแบบการออกแบบมีเพียงเพราะข้อ จำกัด ของภาษาและนั่นเป็นเหตุผลว่าทำไมมีภาษาเชิงหน้าที่น้อยมาก บางทีนี่อาจเป็นตัวอย่างของมัน?
แก้ไข: ในสถานการณ์เฉพาะของฉันฉันไม่ต้องการ แต่ .. คุณจะใช้การกำจัดและการเพิ่ม "ผู้สังเกตการณ์" ในลักษณะการทำงานได้อย่างไร (เช่นคุณจะใช้ฟังก์ชันทั้งหมดในรูปแบบอย่างไร) เพียงแค่ผ่านฟังก์ชั่นใหม่เช่น