지난 몇 년 동안, 내가 좋아하는 언어는 점점 더 "기능적"이되고 있습니다. 저는 이제 "하이브리드": 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 전문가가 디자인 패턴이 언어의 한계 때문에 존재한다고 말한 것을 들었습니다. 이것이 기능적인 언어가 너무 적은 이유입니다. 어쩌면 이것이 예일 수 있습니까?
편집 : 내 특정 시나리오에서는 필요하지 않지만 기능적인 방식으로 "관찰자"를 제거하고 추가하는 방법은 무엇입니까? (즉, 패턴의 모든 기능을 어떻게 구현하겠습니까?) 예를 들어 새로운 기능을 전달하는 것입니까?