development

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

big-blog 2020. 9. 29. 08:08
반응형

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


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

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

객체 지향보다 함수형 프로그래밍을 언제 선택합니까?

다른 종류의 소프트웨어 진화를 예상 할 때 :

  • 객체 지향 언어는 사물대해 고정 된 작업 집합이 있고 코드가 발전함에 따라 주로 새로운 것을 추가 할 때 유용합니다 . 이는 기존 메소드를 구현하는 새 클래스를 추가하여 수행 할 수 있으며 기존 클래스는 그대로 둡니다.

  • 당신의 고정 세트가있을 때 기능적인 언어가 좋은 일을 하고, 코드의 진화, 당신은 주로 새로운 추가 작업을 기존의 것들에. 이는 기존 데이터 유형으로 계산하는 새 함수를 추가하여 수행 할 수 있으며 기존 함수는 그대로 둡니다.

진화가 잘못되면 다음과 같은 문제가 있습니다.

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

  • 기능 프로그램에 새로운 종류를 추가하려면 새로운 케이스를 추가하기 위해 많은 기능 정의를 편집해야 할 수 있습니다.

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

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

기능 언어는 트리 형태로 기호 데이터를 조작하는 데 탁월합니다. 좋아하는 예는 소스와 중간 언어 (주로 같은 거의 변경하지 컴파일러,이다 ), 그러나 컴파일러 작가는 항상 새로운 번역과 코드 개선 또는 최적화 (일 새로운 작업을) 추가. 일반적으로 컴파일과 번역은 기능적 언어의 "킬러 앱"입니다.


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

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

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

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

추천 자료

내가 같은 배 (OOP 배경, FP 배우기)에 있기 때문에 내가 정말 감사 한 몇 가지 독서를 제안합니다.


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

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

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

"기능적 프로그램에 새로운 종류의 것을 추가하려면 새로운 케이스를 추가하기 위해 많은 기능 정의를 편집해야 할 수도 있습니다."라는 Norman의 주장. 함수 코드가 유형 클래스를 얼마나 잘 사용했는지에 따라 다릅니다. 특정 추상 데이터 유형에 대한 패턴 일치가 코드베이스 전체에 퍼져 있으면 실제로이 문제가 발생하지만 시작하기에 좋지 않은 디자인 일 수 있습니다.

EDITED Removed reference to implicit conversions when discussing type classes. In Scala, type classes are encoded with implicit parameters, not conversions, although implicit conversions are another means to acheiving substitution of compatible types.


  1. If you're in a heavily concurrent environment, then pure functional programming is useful. The lack of mutable state makes concurrency almost trivial. See Erlang.

  2. In a multiparadigm language, you may want to model some things functionally if the existence of mutable state is must an implementation detail, and thus FP is a good model for the problem domain. For example, see list comprehensions in Python or std.range in the D programming language. These are inspired by functional programming.

참고URL : https://stackoverflow.com/questions/2078978/functional-programming-vs-object-oriented-programming

반응형