“혼합”언어로 디자인 : 객체 지향 디자인 또는 기능 프로그래밍?


11

지난 몇 년 동안, 내가 좋아하는 언어는 점점 더 "기능적"이되고 있습니다. 저는 이제 "하이브리드": 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 전문가가 디자인 패턴이 언어의 한계 때문에 존재한다고 말한 것을 들었습니다. 이것이 기능적인 언어가 너무 적은 이유입니다. 어쩌면 이것이 예일 수 있습니까?

편집 : 내 특정 시나리오에서는 필요하지 않지만 기능적인 방식으로 "관찰자"를 제거하고 추가하는 방법은 무엇입니까? (즉, 패턴의 모든 기능을 어떻게 구현하겠습니까?) 예를 들어 새로운 기능을 전달하는 것입니까?


배우는 어떻습니까?
kiritsuku

쓸모없는 것들과 클래스를 잊어 버려라. 대신 모듈 측면에서 생각하는 것이 좋습니다. 영감을 얻으려면 SML 및 OCaml 언어를 참조하십시오.
SK-logic

@Antoras 액터를 기반으로 한 접근 방식과 비교할 수 있다면 더 환영받을 것입니다 :)
Lorenzo Dematté

2
@ dema80, OCaml은 완벽하게 멀티 패러다임입니다. 모듈은 기능 프로그래밍과 전혀 관련이 없습니다. 예를 들어 순수한 Ada에는 고급 모듈 시스템이 있습니다. 그리고 OOP의 모든 명성은 실제로 모듈로 가야합니다. OOP의 모든 장점은 모듈 기능을 시뮬레이션하는 다양한 형태 일뿐입니다. 당신은 OOP가 아닌 모듈의 관점에서 생각하면서, 모든 클래스를 잊고 대신 모듈을 표현하기 위해 구문을 사용할 수 있습니다. Btw. 그것이 바로 마이크로 소프트가 mscorlib로 수행 한 것입니다. 많은 OOP가 아니라 모듈과 네임 스페이스입니다.
SK-logic

1
더 좋은 질문은 "FP 방식으로 잃어버린 명확성이나 조직이 있습니까?"입니다.
djechlin

답변:


0

이는 호출 객체에 대한 관심 범위를 벗어난 작업을 수행한다는 개념을 전달하는 두 가지 접근 방식의 좋은 예입니다.

이 예제에서는 기능적 접근 방식으로 가야한다는 것이 분명하지만 일반적으로 호출 된 객체가 표시해야하는 동작이 얼마나 복잡한 지에 따라 달라집니다. 실제로 복잡한 행동의 문제로 비슷한 논리를 자주 적용하고 함수 생성기를 사용하여 명확하게 표현할 수 없다면 클래스 구성이나 상속을 원할 것입니다. 기존 동작을 임시로 재사용하고 확장 할 수있는 자유가 조금 더 있습니다.

그러나 내가 관찰 한 한 가지 패턴은 일반적으로 개발자가 처음에는 기능적 접근 방식을 사용하고 더 세분화 된 동작에 대한 요구가 발생하면 클래스 기반 접근 방식을 선택하기로 결정한다는 것입니다. 예를 들어 Django는 기능 기반 뷰, 템플릿 로더 및 테스트 러너에서 이점과 요구 사항이 분명해졌지만 그 전에는 그렇지 않은 클래스 클래스로 전환했습니다.


나는이 대답이 약간 잘못 안내되었다고 생각합니다. 함수형 프로그래밍은 함수 만 프로그래밍하는 것이 아닙니다. 함수형 프로그래밍은 추상화도 사용하므로 이분법이 없습니다.
Doval

"구성 또는 상속, 기존 행동을 재사용하고 확장 할 수있는 자유가 더 커질 것입니다"라는 말은 순수한 FP의 핵심 이점 중 하나가 아닙니다. 모듈성, 구성 성 및 재사용 성은 기능적으로 코딩 할 때 자연스럽게 발생합니다. 이것은 "OOP"가 아닙니다.
sara

@ FilipDupanović 나는 기존 코드를 재사용하고 확장하는 것을 언급하고있었습니다. 순수한 함수는 아마도 모든 프로그래밍에서 가장 구성 가능한 것들 일 것입니다. 순수한 기능 환경에서 복잡성을 관리 할 수없는 것처럼 작성되었습니다. 단순 부품을 더 크지 만 여전히 불투명하고 불투명 한 부품으로 구성하여 복잡성을 관리하는 것이 FP의 핵심이며, 많은 사람들이 OOP보다 훨씬 우수하다고 주장합니다. "문제가없는 VS 솔리드 OOP를 스케일링하지 않는 기능적인 단일 라이너"사이의 이분법에 동의하지 않습니다.
sara

FP는 코드를 작성하고 재사용 할 때 열등하고 애플리케이션이 더 복잡해지면 OOP가 항상 "더 나은"상태가 될 것이라고 말했다. 나는 이것이 단순히 거짓이며 오해의 소지가 있다고 주장하기 때문에 그것이 공감대를 보증한다고 생각했다. 정말 "순수한 열광"입니까? 주석은 이와 같은 광범위한 토론을위한 것이 아니므로 여기서는 더 이상 논의하지 않겠습니다.
sara

5

기능 버전은 훨씬 짧고 유지 관리가 쉽고 읽기가 쉽고 일반적으로 상상할 수있는 모든 측면에서 훨씬 뛰어납니다.

모든 패턴 과는 거리가 멀지 만 많은 사람들 관찰자와 같은 OOP의 기능 부족을 보완해야합니다. 그것들은 기능적으로 훨씬 더 잘 모델링됩니다.


동의하고 같은 느낌입니다.
Lorenzo Dematté

나는 동의하고 같은 느낌을 가지고 있지만 기능 코드를 사용하여 일종의 "속임수"를 사용하고 있습니다. 내 질문을 편집했습니다
Lorenzo Dematté

5

"FP 전문가"는 부분적으로 옳습니다. 많은 OO 패턴은 기능적인 일을하기위한 해킹입니다. (이것은 FP 언어가 거의 의심스럽지 않은 이유라고 주장합니다.) 관찰자와 전략 패턴은 일류 함수를 모방하려고합니다. 방문자 패턴은 패턴 일치를 시뮬레이션하는 핵입니다. 당신 IItemObserver은 변장 한 기능 일뿐입니다. 물건을 가져다주는 다른 기능과 다른 척하는 것은 아무것도 사지 않습니다.

객체는 데이터 추상화의 한 종류 일뿐입니다. 이 논문 은 그 주제에 대해 약간의 이해를 돕습니다. 객체는 유용 할 수 있지만 모든 것에 적합하지 않다는 것을 인식하는 것이 중요합니다. 이분법이 없습니다. 올바른 작업에 적합한 도구를 선택하는 것만으로도 기능 프로그래밍은 객체를 포기할 필요가 없습니다. 기능 프로그래밍은 단순히 함수를 사용하는 것 이상입니다. 또한 부작용과 돌연변이를 최소화하는 것에 관한 것입니다.


(IMO)에 대한 답이 +1입니다. 또한, 논문에 대한 링크에 감사드립니다. 나는 얼마 전에 그것을 읽은 후 잃어 버렸습니다. 이제 다시 찾았습니다.
조르지오

-1

나는 기능적인 언어에 능숙하지 않기 때문에 질문에 실제로 대답 할 수 없습니다. 그러나 나는 당신이 일하는 한 접근에 대해 덜 걱정해야한다고 생각합니다. 내가 이해하는 것에서, 나중에 더 많은 리스너를 추가하지 않거나 실행 중에 리스너를 변경하지 않는 한 여기에서 Observer 패턴을 건너 뛸 수 있습니다.

디자인 패턴이 OO 언어에서 "제한"을 구성한다는 데 동의하지 않습니다. OOP 기능을 잘 활용하기 위해 있습니다. 다형성과 상속은 제한이 아닌 기능입니다. 디자인 패턴은 이러한 기능을 사용하여 유연한 디자인을 촉진합니다. OO에서 절대적으로 비 OO 프로그램을 만들 수 있습니다. 주의를 기울이면 FP를 모방 한 상태가없는 객체를 포함하는 전체 프로그램을 작성할 수 있습니다.


1
"많은주의를 기울이면 FP를 흉내 낸 상태가없는 객체를 포함하는 전체 프로그램을 작성할 수 있습니다."물론 훈련을 통해 명령형 언어로도 동일한 작업을 수행 할 수 있습니다. :) 일반적으로 디자인 패턴을 제한을 보완하는 것으로 생각하지 않지만 방문자 패턴의 경우를 고려하십시오.
Lorenzo Dematté

또한, 나는이 코드에 관심 있지 않다 : 그러나,이 방법에 동료 프로그래머 직면 싶습니다 (내 이해,이 programmers.se 그렇지 않으면 내가 그렇게 내 Q 게시 한 것입니다 것입니다)
로렌조 Dematté

반복되는 패턴을 발견 할 때마다 이는 언어 및 모델링 프레임 워크의 심각한 제한을 나타냅니다. 이상적인 세상에는 패턴이 전혀 없을 것입니다.
SK-논리

@ SK-logic : 불행히도 세계는 이상적이지 않으며, 실제 세계에는 패턴이 있습니다. 어느 OO 언어가 상속을 왜, 상태가 again.Real 세계 객체 위에 그들 모두를 다시 작성할 필요없이 repeateable 코드를 구현하는 것입니다, 국가 패턴이 왜 먹으 렴
DPD

1
@ SK-logic : 일부 언어는 프로그래밍이 가능하고 일부는 형식 시스템의 효과를 적용 할 수 있음을 잘 알고 있습니다. 내 요점은 "OOP"와 같이 "패턴"은 슬프게도 잘못 이해되는 용어입니다. 패턴은에 다시 나타나지 계속 뭔가 비슷하지만 다른 형태 즉, 균일 한 솔루션을 인정하지 않습니다 . 때때로 당신은 그러한 쿼터 반복이 사라지게 할 수 있습니다-멀티 메소드는 방문자 / 더블 디스패치를 ​​중복시킵니다. 그것은 "모든 패턴이 결핍의 징후"를 의미하지는 않습니다. 왜냐하면 그것은 현실 세계 가 부족 하다는 것을 의미하기 때문입니다 . 패턴은 소프트웨어가 아닌 아키텍처 에서 시작되었습니다 .
Frank Shearar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.