함수형 프로그래밍 대 객체 지향 프로그래밍


784

나는 지금까지 OO 프로그래밍에 주로 노출되어 왔으며 기능적 언어를 배우기를 고대하고 있습니다. 내 질문은 :

  • 언제 객체 지향적 인 기능 프로그래밍을 선택합니까?
  • 함수형 프로그래밍이 더 나은 선택의 일반적인 문제 정의는 무엇입니까?



1
비슷한 질문 cs.se는 함수형 프로그래밍이 명령형 스타일보다 더 나은 결과를 제공하는 예제가 무엇인지에 대해서도 결론을 내 렸습니다 . 기존의 지혜는 하나가 다른 것보다 우월하지 않거나 간단한 기준으로 비교할 수 없거나 다른 목적으로 사용된다는 것 같습니다. 따라서이 질문은 "산업 대 학계"도 해결할 수없는 POV / 충돌을 설정합니다. 기능 프로그래밍에서 OOP sytle을 보여주는 하나의 고전적인 참조, SICP book / MIT
vzn

" OO는 움직이는 부분을 캡슐화하여 코드를 이해할 수있게합니다. FP는 움직이는 부분을 최소화하여 코드를 이해할 수있게합니다. "
Micheal

답변:


1193

언제 객체 지향적 인 기능 프로그래밍을 선택합니까?

다른 종류의 소프트웨어 진화가 예상되는 경우 :

  • 객체 지향 언어는 사물 에 대한 고정 된 연산 세트가있을 때 유용 하며 코드가 발전함에 따라 주로 새로운 사물을 추가합니다. 기존 메소드를 구현하는 새 클래스를 추가하면 기존 클래스를 그대로 유지할 수 있습니다.

  • 함수형 언어는 고정 된 사물 집합이있을 때 유용 하며 코드가 발전함에 따라 기존 사물에 대한 새로운 작업 을 주로 추가 합니다. 기존 데이터 형식으로 계산하는 새 함수를 추가하면 기존 함수가 그대로 유지됩니다.

진화가 잘못되면 문제가 있습니다.

  • 객체 지향 프로그램에 새로운 작업을 추가하려면 새로운 메소드를 추가하기 위해 많은 클래스 정의를 편집해야 할 수도 있습니다.

  • 기능 프로그램에 새로운 종류의 것을 추가하려면 새로운 기능을 추가하기 위해 많은 기능 정의를 편집해야합니다.

이 문제는 수년간 잘 알려져있다. 1998 년 Phil Wadler는이를 "표현 문제"라고 불렀습니다 . 일부 연구자들은 믹스 인과 같은 언어 기능으로 표현 문제를 해결할 수 있다고 생각하지만 널리 받아 들여지는 솔루션은 아직 주류에 미치지 못했습니다.

함수형 프로그래밍이 더 나은 선택의 일반적인 문제 정의는 무엇입니까?

기능적 언어는 트리 형식으로 기호 데이터를 조작하는 데 탁월합니다. 가장 좋아하는 예는 소스 언어와 중간 언어가 거의 바뀌지 않는 컴파일러 (대부분 동일한 내용 )이지만 컴파일러 작성자는 항상 새로운 번역과 코드 개선 또는 최적화 (사물에 대한 새로운 작업)를 추가하고 있습니다. 컴파일 및 번역은 더 일반적으로 기능적 언어를위한 "킬러 앱"입니다.


119
이 답변 뒤에는 심각한 선이 있습니다. 특정 OOP 디자인 패턴 (방문자)이 실제로 새로운 작업 추가 문제를 극복하려는 해킹이라는 사실을 조명한다고 생각합니다.
Jacobs Data Solutions

54
JavaScript에서는 모든 것을 가질 수 있습니다.
Erik Reppen

61
@ErikReppen 질문이 발생하는 시점, 언제 기능 기능을 사용하도록 선택하고 언제 객체 지향 기능을 사용하도록 선택합니까?
노먼 램지

7
@NormanRamsey JS에서 그것을 혼합하는 것은 드문 일이 아니며 일류 함수는 많은 JS OOP 관련 기능과 연결되어 있습니다. JS의 배열 정렬은 강력한 데이터 구조를 생성 할 수있는 인수로 기능을 수행합니다. 클로저 + 전달 된 함수는 대부분의 메소드가 단지 참조이기 때문에 jquery 객체를 매우 가벼운 메모리 말하기를 유지하는 데 사용합니다. 기타 ...
Erik Reppen

9
@NormanRamsey : SICP 라인을 따라 아주 좋은 대답입니다. 이 분류에 따르면 기능적 및 절차 적 프로그래밍은 객체 지향 프로그래밍의 반대편에 함께 그룹화됩니다. 이것은 1980 년대 후반, 1990 년대 초반에 OOP의 붐을 설명 할 수 있습니다. 그리고 점점 더 많은 위젯들. 물론, 이것이 설명한 것처럼 OOP가 절차 상 절차보다 낫다는 것을 의미하지는 않습니다.
Giorgio

177

반드시 두 패러다임 중에서 선택할 필요는 없습니다. 많은 기능 개념을 사용하여 OO 아키텍처로 소프트웨어를 작성할 수 있습니다. FP와 OOP는 본질적으로 직교 합니다.

예를 들어 C #을 보자. 대부분 OOP라고 말할 수 있지만 많은 FP 개념과 구성이 있습니다. Linq 를 고려한다면 Linq가 존재하도록하는 가장 중요한 구성은 본질적으로 기능적입니다 : 람다 식 .

또 다른 예는 F #입니다. 대부분 FP라고 말할 수 있지만 많은 OOP 개념과 구성이 있습니다. 클래스, 추상 클래스, 인터페이스를 정의하고 상속을 처리 할 수 ​​있습니다. 코드를 명확하게 만들거나 성능을 크게 향상시킬 때도 가변성을 사용할 수 있습니다.

많은 현대 언어는 다중 패러다임입니다.

추천 자료

나는 같은 보트 (OOP 배경, FP 학습)에 있기 때문에 정말 감사 한 독서를 제안합니다.


8
@ duffymo : 당신의 의견, 당신이 그것을 넣는 방식은 대부분 무의미합니다. 언어, 가상 머신 또는 플랫폼의 비교를 원하는 사람은 없습니다. 감사합니다.
Bruno Reis이 (가)

6
@Bruno- ".power의 힘"에 대한 답변. 편하게 하다.
duffymo

6
웃긴, 나는 당신이 그의 무의미한 의견에 대해 다이 캄을 꾸짖는 것을 보지 못했습니다. 내가 보지 않았을 때 중재자로 지명 되었습니까? 당신 외에는 아무도 불타 지 않습니다. 다시 말해 줄 게요.
duffymo

4
타 오르기 시작하면 미안해 .NET은 OOP 만 지원하지 않는다는 것만으로 다른 플랫폼의 성능이 떨어 졌다는 의미는 아닙니다. 예를 들어 테일 콜 최적화 기능이 있습니다.
Dykam

5
@nawfal, 당신이 두 패러다임의 본질적인 특징을 지적하고 그것들이 양립 할 수 없다고 말할 때까지, 그것들은 직교 적입니다. 그것은 토론의 핵심입니다. FP는 정의에 따라 명령 프로그래밍과 호환되지 않지만 OOP는 명령 프로그래밍으로 제한되지 않습니다. 우리가이 개념들에 대해 다른 말을하는 이유는 우리가 그들에 대해 이야기 할 수 있도록하기 위해서입니다.
DavidS

31

객체 지향 프로그래밍은 다음을 제공합니다.

  1. 캡슐화
    • 내부 상태의 돌연변이 제어
    • 내부 표현으로 결합 제한
  2. 서브 타이핑 :
    • 호환 가능한 유형의 대체 (다형성)
    • 클래스간에 구현을 공유하는 조잡한 수단 (구현 상속)

Haskell 또는 Scala의 함수형 프로그래밍은보다 일반적인 형식 클래스 메커니즘을 통해 대체 할 수 있습니다. 가변 내부 상태는 권장되지 않거나 금지되어 있습니다. 내부 표현을 캡슐화 할 수도 있습니다. 좋은 비교는 Haskell vs OOP 를 참조하십시오 .

Norman은 "기능 프로그램에 새로운 종류의 것을 추가하려면 새로운 기능을 추가하기 위해 많은 기능 정의를 편집해야 할 수도있다"고 주장했다. 기능 코드가 유형 클래스를 얼마나 잘 채택했는지에 달려 있습니다. 특정 추상 데이터 유형에 대한 패턴 일치가 코드베이스 전체에 퍼져 있다면 실제로이 문제로 어려움을 겪을 지 모르지만 처음에는 디자인이 좋지 않을 수 있습니다.

EDITED 형식 클래스를 논의 할 때 암시 적 변환에 대한 참조가 제거되었습니다. 스칼라에서 타입 클래스는 변환이 아닌 암시 적 매개 변수로 인코딩되지만 암시 적 변환은 호환 가능한 유형의 대체를 달성하는 또 다른 수단입니다.


3
타입 클래스는 다른 타입으로의 암시 적 변환을위한 메커니즘이 아닙니다. 다형성의 형태를 제공하기 위해 유형에 대해 정의 된 함수 세트에 대한 설명입니다. Java 스타일 OOP에서 가장 가까운 것은 인터페이스이지만 Haskell 유형 클래스에는 몇 가지 중요한 차이점이 있습니다.
Zak

25
  1. 많은 동시 환경에있는 경우 순수 기능 프로그래밍이 유용합니다. 변경 가능한 상태가 없으면 동시성이 거의 사소합니다. Erlang을 참조하십시오.

  2. 다중 패러다임 언어에서, 변경 가능한 상태의 존재가 구현 세부 사항이어야하므로 FP가 문제 영역에 적합한 모델 인 경우 일부 기능을 모델링 할 수 있습니다. 예를 들어 Python의 목록 이해 또는 D 프로그래밍 언어의 std.range 를 참조하십시오 . 이들은 함수형 프로그래밍에서 영감을 얻었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.