최근에 Haskell과 같은 기능적 언어를 사용하는 것에 대해 많은 이야기를 들었습니다. 함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점, 장단점은 무엇입니까?
최근에 Haskell과 같은 기능적 언어를 사용하는 것에 대해 많은 이야기를 들었습니다. 함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점, 장단점은 무엇입니까?
답변:
나는 그것이 기능적 프로그래밍 대 명령형 프로그래밍 이라고 말합니다 .
가장 큰 차이점은 명령형 프로그래밍은 제어 흐름 에 관한 것이고 기능 형 프로그래밍은 데이터 흐름 에 관한 것 입니다. 그 말을하는 또 다른 방법은 프로그래밍 기능 만 사용한다는 것입니다 표현을 필수 프로그램 모두 동시에 표현 과 문장이 사용된다.
예를 들어, 명령형 프로그래밍 에서는 상태를 처리 할 때 변수와 루프가 일반적이지만 기능적 프로그래밍에서는 상태가 매개 변수 전달을 통해 처리되므로 부작용과 할당을 피할 수 있습니다.
리스트의 합을 계산하는 함수의 명령형 의사 코드 (합은 변수에 유지됨) :
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
동일한 함수에 대한 함수 의사 코드 (합은 매개 변수로 전달됨) :
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
기능적 개념에 대한 좋은 소개를 위해 Simon Peyton-Jones의 기능적 프로그래밍을 통한 테이밍 효과 프레젠테이션을 추천합니다 .
함수형 프로그래밍은 선언적 모델을 기반으로하며 람다 미적분에서 유래합니다. C ++ 및 C #과 같은보다 필수적인 언어에서 빌릴 수있는 많은 훌륭한 개념을 제공합니다.
참조 투명성, 람다 함수, 퍼스트 클래스 함수, 게으르고 간절한 평가, 불변성 등이 있습니다.
기능 프로그래밍을 배우는 것이 아무것도 없다면 그것이 포함 된 개념에 유용합니다. 프로그래밍 방식을 바꾸고 프로그래밍에 대해 생각합니다. 그리고 미래에는 기능 지향 프로그래밍이 객체 지향 프로그래밍만큼 중요 할 것이라고 생각합니다.
시작하려면 Haskell과 같은 순수한 기능 언어를 사용하거나 F # 과 같은 하이브리드 언어를 사용할 수 있습니다 .
대부분의 훌륭한 대학은 기능적 프로그래밍을 다루며 학교에 가면 그 과정을 수강 할 것을 강력히 권합니다.
함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점, 장단점은 무엇입니까?
객체 지향 프로그래밍은 복잡한 문제를 계층 구조로 모델링하여 문제를 단순화 할 수 있기 때문에 좋습니다. 그러나 가변 객체를 사용하는 동안 다중 스레드 프로그래밍을 고려하기 시작하면 매우 어려워집니다. 이러한 경우 동기화 개체를 많이 사용해야하며 대규모 응용 프로그램을 완벽하게 구현하는 것은 거의 불가능합니다.
그것이 바로 함수형 프로그래밍이 시작되는 곳입니다. 불변성과 같은 것 때문에 함수형 프로그래밍은 다중 스레드 프로그램을 단순화시킵니다. 입력 X를 함수에 제공하면 항상 Y를 출력한다는 것을 알 때 무언가를 병렬화하는 것이 거의 쉽습니다. 또한 변수 (또는 함수형 프로그래밍의 값)는 다른 스레드에서 사용 중일 때 변경할 수 없다는 것을 알고 있습니다.
(이 답변은 StackOverflow의 비공개 질문에 대한 답변 에서 수정되었습니다 .)
함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점 중 하나는 각기 다른 종류의 소프트웨어 진화에서 더 낫다는 것입니다.
객체 지향 언어는 사물 에 대한 고정 된 조작 세트가있을 때 유용 하며 코드가 발전함에 따라 주로 새로운 사물을 추가합니다. 기존 메소드를 구현하는 새 클래스를 추가하면 기존 클래스를 그대로 유지할 수 있습니다.
함수형 언어는 고정 된 사물 집합이있을 때 유용 하며 코드가 발전함에 따라 기존 사물에 대한 새로운 작업 을 주로 추가 합니다. 기존 데이터 형식으로 계산하는 새 함수를 추가하면 기존 함수가 그대로 유지됩니다.
진화가 잘못되면 문제가 있습니다.
객체 지향 프로그램에 새로운 작업을 추가하려면 새로운 메소드를 추가하기 위해 많은 클래스 정의를 편집해야 할 수도 있습니다.
기능 프로그램에 새로운 종류의 것을 추가하려면 새로운 기능을 추가하기 위해 많은 기능 정의를 편집해야합니다.
이 문제는 수년간 잘 알려져있다. 1998 년 Phil Wadler는이를 "표현 문제"라고 불렀습니다 . 일부 연구자들은 믹스 인과 같은 언어 기능으로 표현 문제를 해결할 수 있다고 생각하지만 널리 받아 들여지는 솔루션은 아직 주류에 미치지 못했습니다.
실제 대는 없습니다. 그들은 완벽하게 보완적일 수 있습니다. OOP를 지원하는 FP 언어가 있습니다. 그러나 커뮤니티는 모듈성을 처리하는 방식이 다릅니다.
FP 언어 사용자는 수학 법칙을 통해 모듈성을 달성하는 경향이 있습니다. 또한 법을 준수한다는 증거를 선호합니다.
명령형 OOP 사용자는 테스트 사례에서 개체의 동작을 캡처하는 경향이 있으며, 개체가 변경되고 모듈 방식으로 변경되면 다시 실행할 수 있습니다.
그것은 단지 작은 측면이지만 언급 할 가치가 있다고 생각합니다.
유추 :
구직 신청을하셨습니다. 당신은 당신의 이름, 연락처 정보 및 작업 내역을 입력합니다. 완료되면 더 이상 빈 응용 프로그램이 없습니다.
대신 글을 쓰기 전에 명확한 셀로판으로 오버레이한다고 상상해보십시오. 당신은 당신의 이름을 씁니다. 다른 셀로판 시트를 추가합니다. 당신은 당신의 연락처 정보를 작성합니다. 더 많은 셀로판. 당신은 당신의 작업 기록을 작성합니다. 완료 한 후에도 빈 응용 프로그램은 그대로 유지됩니다. 또한 단일, 별개의 변화의 효과를 포착 한 세 장의 셀로판이 있습니다.
전자 (OOP)는 상황을 바꾸는 아이디어를 수용하는 반면 후자 (FP)는이를 피한다. 둘 다 상태 관리 패러다임입니다. 두 가지 모두 다른 전략을 사용하여 구직 신청 완료의 효과를 포착 할 수 있습니다. OOP는 시작 기기를 직접 변경하고 FP 는 변경 모양에 영향을주기 위해 이전 에 온 것을 오버레이합니다 .