FP와 OO 직교?


13

나는 여러 번 들었고 FP와 OO가 직교한다는 생각을 이해하고 확인하려고 노력하고 있습니다.

우선, 두 개념이 직교한다는 것은 무엇을 의미합니까?

FP는 가능한 한 불변성과 순도를 권장합니다. OO는 상태와 돌연변이 (약간의 체계화 된 명령형 프로그래밍 버전)를 위해 만들어진 것 같습니다. 그리고 나는 객체가 변경 불가능하다는 것을 알고 있습니다. 그러나 OO는 나에게 상태 / 변경을 암시하는 것 같습니다.

그들은 반대처럼 보인다. 그것은 그들이 직교한다는 것을 의미합니까?

스칼라와 같은 언어를 사용하면 OO와 FP를 모두 쉽게 수행 할 수 있습니다. 이는 두 가지 방법의 직교성에 영향을 줍니까?


5
객체 지향은 객체가 상태를 조작하기 위해 필요하지 않습니다. 메소드는 새로운 오브젝트를 결과로 리턴 할 수 있습니다. 객체의 상태를 수정할 수 있고 종종 수정한다는 사실이 객체의 상태를 유지하거나 좋은 아이디어라는 의미는 아닙니다. OO와 FP는 반대가 아닙니다.
Huperniketes

4
스택 오버플로에서 중복 : FP 및 OO 직교?
sepp2k

답변:


22

"직교 (orthogonal)"라는 용어는 "수직 (perpendicular)"이라는 동의어가있는 수학에서 나옵니다. 이러한 맥락에서, "두 가지 일은 서로 관련이 없습니다."로 이해할 수 있습니다.

사람들이 FP와 OO를 비교할 때 종종 두 개의 별도 축을 혼동합니다.

한편으로는 함수형 프로그래밍과 명령형 프로그래밍이 있습니다. 조나스는 이 둘을 잘 비교 합니다. 한 문장 버전은 "데이터 흐름 대 제어 흐름"이라고 말합니다.

다른 축은 데이터 추상화입니다. Haskell과 같은 언어는 추상 데이터 유형을 사용하여 추상 데이터를 사용합니다. 스몰 토크는 객체를 사용하여 데이터와 해당 데이터의 작업을 단일 단위로 통합합니다. 윌리엄 쿡 (William Cook)은 자신의 논문 인 ' 데이터 추상화 이해 에 관한 논문'에서 내가 할 수있는 것보다 더 잘 설명합니다 .

대부분의 사람들은 FP와 OO가 반대라고 생각한다는 것을 완벽하게 이해할 수 있습니다. 대부분의 OO 언어는 필수적이므로 Haskell과 Java를 비교하면 데이터 흐름 + ADT 대 제어 흐름 + 객체가 있습니다. 그러나 다른 가능성이 있습니다! 마티아스 펠리 센 행복하게 자신의 이야기에 FP와 OO 결혼하는 방법에 대해 설명 기능 객체 .


+1, 좋은 답변입니다. 그래도 Haskell 타입 클래스에 대한 답변이 누락되었습니다.
missingfaktor

확실 해요 나는 단지 한 단지 실제로 하스켈을 배우기 시작했다.
Frank Shearar

그 Functional Objects 프리젠 테이션에 대한 기록이 있는지 궁금합니다. 정말 관심이 있지만 슬라이드만으로는 실제로 정의가되지 않습니다.
Rei Miyasaka

9

우선, 두 개념이 직교한다는 것은 무엇을 의미합니까?

이는 두 개념이 대조되는 아이디어가 없거나 서로 호환되지 않는다는 것을 의미합니다.

FP는 가능한 한 불변성과 순도를 권장합니다. OO는 상태와 돌연변이 (약간의 체계화 된 명령형 프로그래밍 버전)를 위해 만들어진 것 같습니다. 그리고 나는 객체가 변경 불가능하다는 것을 알고 있습니다. 그러나 OO는 나에게 상태 / 변경을 암시하는 것 같습니다.

그들은 반대처럼 보인다. 그것들이 직교성에 어떤 영향을 미칩니 까?

스칼라와 같은 언어를 사용하면 OO와 FP를 모두 쉽게 수행 할 수 있습니다. 이는 두 가지 방법의 직교성에 영향을 줍니까?

OO는 캡슐화, 객체 구성, 데이터 추상화, 서브 타이핑을 통한 다형성 및 필요한 경우 제어 된 돌연변이 에 관한 것입니다 (OO에서도 불변성이 권장됩니다). FP는 함수 구성, 제어 추상화 및 제한된 다형성 (일명 파라 메트릭 다형성)에 관한 것입니다. 따라서 두 가지 아이디어는 모순되지 않습니다. 두 언어 모두 서로 다른 종류의 능력과 추상화 메커니즘을 제공하며 한 언어로도 가능합니다. 사실, 이것은 스칼라 가 세워진 논문입니다 !

그의에서 스칼라 실험 OO 및 FP - - 구글 토크, 마틴 오더 스키는 아주 잘 그는 두 개념을 믿고 어떻게 설명 서로 직교 및 스칼라는 대중적으로 스칼라 커뮤니티에 알려진 새로운 패러다임으로 우아하고 완벽하게 두 패러다임을 통합하는 방법 객체 기능 패러다임. 당신을 위해 대화를 지켜봐야합니다. :-)


: 객체 함수형 언어의 다른 예 OCaml로 , F # , Nemerle .


1
"두 개념이 서로 대조되는 아이디어가 없거나 서로 호환되지 않는다는 것을 의미합니다." -사실이지만, 나는 " 고유 하지만 호환되지 않는" 과 같은 것을 말할 것이라고 생각 합니다. 예를 들어, 하나가 다른 하나의 부분 집합 인 경우 서로 호환되지 않지만 직교하지도 않습니다.
Tim Goodman

@Tim : 그것은 용어를 정의하려는 나의 실패 일 것입니다. 나는 당신이 보는 영어 전문가가 아닙니다. :-|
missingfaktor

7

직교는 대략 "독립적"을 의미합니다.

따라서 FP와 OO가 직교이면 객체 사용 여부에 관계없이 불변성을 사용할 수 있으며 불변 여부에 관계없이 객체를 사용할 수 있습니다.


2
"독립적"은 그것을 넣는 좋은 방법입니다. 그것들이 반대가 아니라 코드가 함수형 프로그래밍 스타일인지 객체 지향 프로그래밍 스타일인지는 별개의 것입니다. 그것들을 그래프의 x 및 y 축과 같이 생각하십시오. 다른 쪽은 고정 된 상태에서 위아래로 움직일 수 있습니다. (수학적 의미에서, x 방향의 벡터와 y 방향의 벡터는 문자 그대로 직교합니다-CS 정의는 관련되어 있습니다.)
Tim Goodman

@ TimGoodman : 나는 당신이 만든 그래프 비유에서 x, y 축을 정말로 좋아했습니다. 이것은 최종 결과에 매핑 할 수있는 또 다른 대 한 방향으로 한 이동 때 달성 (I 평균 궁극적으로 모두 프로그래밍 패러다임의 목표는 쉽고 유지 보수 코드를 가지고있다, 아니다?)
rahulaga_dev

0

* 나는 여러 번 들었고 FP와 OO가 직교한다는 생각을 이해하고 검증하려고 노력하고 있습니다. *

우선, 두 개념이 직교한다는 것은 무엇을 의미합니까?

Wikipedia 인용 : "직교성 (Orthogonality)은 시스템의 구성 요소에 의해 생성 된 기술적 효과를 수정해도 시스템의 다른 구성 요소에 부작용을 일으키거나 전파하지 않음을 보증합니다."

단순히 한 시스템의 변경이 다른 시스템의 변경에 영향을 미치지 않으며 영향을 줄 수 없음을 의미합니다.

예를 들어, 자동차에는 직교 구성 요소 및 제어 기능이 있습니다 (예 : 차량 가속은 가속 기능과 관련된 구성 요소 외에 다른 요소에는 영향을 미치지 않습니다. 예를 들어 라디오에는 영향을 미치지 않습니다 (CD 재생에 영향을 미치는지 확실하지 않지만 광산은 때때로 건너 뛰기 때문에)).

FP는 가능한 한 불변성과 순도를 권장합니다. OO는 상태와 돌연변이 (약간의 체계화 된 명령형 프로그래밍 버전)를 위해 만들어진 것 같습니다. 그리고 나는 객체가 변경 불가능하다는 것을 알고 있습니다. 그러나 OO는 나에게 상태 / 변경을 암시하는 것 같습니다.

그들은 반대처럼 보인다. 그것은 그들이 직교한다는 것을 의미합니까?

킨다 문제는 이러한 개념 중 어느 것도 실제로 정의하기 어려운 것은 없다는 것입니다. 그러나 네, 당신은 그것의 요점을 얻었습니다.

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