기능적 언어를 배우면 더 나은 OOP 프로그래머가됩니까? [닫은]


28

Java / C # / C ++ 프로그래머로서 기능 언어에 대해 많은 이야기를 듣지만 언어를 배울 필요는 없었습니다. 또한 기능적 언어로 도입 된 높은 수준의 사고로 인해보다 나은 OOP / 절차 언어 프로그래머가 될 수 있다고 들었습니다.

누구든지 이것을 확인할 수 있습니까? 프로그래밍 기술을 향상시키는 방법은 무엇입니까?

덜 복잡한 언어의 기술 향상을 목표로 배울 수있는 좋은 언어는 무엇입니까?


3
C #으로 코딩하는 경우 이미 알고 있습니다. LINQ는 상당히 기능적인 것입니다.
SK-logic

실제 객체를 모델링하는 데 OOP가 더 좋다고 생각합니다.
Tulains Córdova

1
@ user61852 대부분의 OO 디자인 패턴은 "실제"객체에 대한 것은 아니지만 실제로는 매우 추상적 인 개념을 모델링합니다.
Andres F.

Java / C # (+ C ++) 프로그래머 이상이 되십시오. 작은 XY 팜플렛을 가진 거대한 스위스 군용 칼에는 블레이드 X를 40 중에서 선택하는 이유와 원하는 것 근처에서 개척 할 수있는 블레이드가 간략하게 설명되어 있습니다. 많은 생각없이 다양한 환경에 적용 할 수 있습니다. (
물리적

답변:


32

나는 기본적으로 FrustratedWithFormsDesign의 답변에 동의 하지만, 새로운 패러다임을 배우는 것이 자신의 기술을 개발하는 데 어떻게 도움이되는지 물었습니다. 내 경험에서 몇 가지 예를들 수 있습니다.

함수형 프로그래밍을 배우기 때문에, 내가 사용하는 개념이 자연적으로 "개체"(일반적으로 돌연변이가 의미가있는 곳)로 간주되고 더 자연스럽게 불변의 "값"으로 간주되는 것에 대해 더 많이 의식하고 있습니다 (중요한 차이점이 있다고 생각합니다) , OO가 의미가있는 곳과 FP가 의미가있는 시점을 만지는 것은 내 의견 일뿐입니다).

코드에 부작용이 포함 된 부분을 확인하고 해당 위치를 분리하여 더 많은 기능을 "순수한"기능으로 만드는 데주의를 기울였습니다. 이것은 내 OO 코드의 테스트 가능성을 크게 향상시킵니다.

데이터 표현의주기에 대해 더 의식하고 있습니다. (예를 들어, Haskell에서 연결된 목록을 이중 연결 목록으로 변환하는 함수를 작성할 수 있다고 생각하지 않으므로 해당 언어의주기가 훨씬 더 많이 나타납니다.주기를 피하면 동기화 양이 줄어 듭니다. 데이터 구조가 내부적으로 일관되도록 수행해야하므로 스레드간에 이러한 구조를 공유하는 부담이 줄어 듭니다.

나는 재귀에 더 의존 할 가능성이 높다 (체계의 재귀 반복 구조는 아름다움이다). Dijkstra는 구조적 프로그래밍 에 대한 노트에서 이것의 중요성에 대해 언급했습니다. 재귀 알고리즘은 수학 유도에 매우 직접적으로 매핑되므로 루프를 올바르게 증명할 수있는 유일한 방법이라고 제안합니다. (코드를 올바르게 증명해야한다고 제안하지는 않지만 코드를 올바르게 작성할수록 코드가 정확할 가능성이 높습니다.)

고차 함수를 사용할 가능성이 높습니다. John Hughes의 논문, 왜 함수형 프로그래밍이 중요한가 . 기능적 프로그래밍 기술, 고차 함수가 주요 역할을 수행함으로써 얻을 수있는 구성 성을 강조합니다.

또한 Jetti의 답변 에서 다룬 것처럼 많은 FP 아이디어가 새로운 OO 언어에 통합되어 있음을 알 수 있습니다. 루비와 파이썬은 모두 많은 고차 함수를 제공합니다 .LINQ는 C #에 모나드 이해를 지원하려는 시도로 묘사되었으며 C ++조차도 람다 식을 가지고 있다고 들었습니다.


@Aidan : C ++ 0x의 wrt 람다, 새로운 C ++ 컴파일러가 이미 통합했습니다.
Matthieu M.

1
"변경 가능한 상태를 유지하는 것"으로 "객체"는 매우 일반적이지만 값 객체 패턴은 수년 동안 존재 해 왔습니다.
Frank Shearar

@ Matthieu, 감사합니다, 나는 그것을 반영하기 위해 텍스트를 업데이트했습니다.
Aidan Cully

@ Frank : 포인터 주셔서 감사합니다. 나는 이것을 대답에 포함시키지 않았지만, 객체에 가치를 부여 해야하는 주요 반대 의견은 객체가 소유 한 구별 객체 객체 인터페이스와 객체 간의 관계 가 더 많은 작업과 관련 이 있습니다. 객체 자체보다 기본). 1 + 2수학적으로 동등 2 + 1하지만, 1.+(2)다르게 구현됩니다 2.+(1). 객체 인터페이스를 사용하는 것보다 연산을 사용하여보다 자연스럽게 이해할 수있는 것보다 많은 SW 문제가 있습니다.
Aidan Cully

1
@Aidan 윌리엄 쿡의 "데이터 추상화 이해, 재검토"를 읽었습니까? 그것은 당신이 암시하고있는 객체와 ADT의 차이점을 탐구합니다.
Frank Shearar

32

더 나은 OOP 프로그래머를 보장한다고 보장하지는 않지만 새로운 사고 방식을 소개 할 것이므로 OOP 측면 뿐만 아니라 일반적인 문제 해결에 더 도움 될 수 있습니다 .


3
객체가 실제로 고차 함수라는 것을 감안할 때 FP 학습은 OOP에 직접 도움이된다는 것을 알았습니다. 더 일반적으로 적용 가능하거나 도움이됩니다.
Frank Shearar

12

함수형 언어 배우기-Lisp for me는 병렬 응용 프로그램을 구축 할 때 실제로 도움이됩니다. 기능적 방법 (상태 기반, 부작용 없음)은 동기화가 훨씬 쉬우 며 입력에만 의존하기 때문에 스레드를 안전하게 만들 수 있습니다. 즉, 특정 코드 영역에서 감시해야하는 유일한 데이터는 전달하는 매개 변수뿐입니다. 또한 디버그하기가 더 쉽습니다.


또한 스레딩 라이브러리에 도움이되며 순수한 기능을 작업으로 기대하는 경향이 있습니다. 또한 간접적으로 도움이 될 수 있습니다. 일종의 "기능적 스타일"로 OO 코드를 작성하는 곳이 있는데, 여기에는 함수가 참조하고 사용하는 많은 객체에 암시 적 잠금이있는 "소유 매개 변수"가 있습니다. . 기대치를 문서화하고 (단위 테스트) 잠금 문제가 거의없는 더 나은 멀티 스레드 코드를 제공 할 수 있습니다. 그리고 명백한 잠금은 거의 없습니다.

나는 프롤로그가 기능적 언어라고 불리는 것을 들어 본 적이 없다. 내가 곁눈질을하면 Prolog가 FP를 어떻게 도울 수 있는지 모호하게 볼 수 있습니다.
Frank Shearar

1
프롤로그는 기능적인 언어가 아닙니다. 논리 언어입니다. 함수형 프로그래밍 기능이 통합 된 프롤로그 와 같은 논리 언어 를 원한다면 Mercury 에서 정보를 얻을 수 있습니다 . 경고 : Prolog를 이미 알고 있어도 뇌에 약간의 상처를 줄 수 있습니다.
내 올바른 의견에

@JUST 나의 올바른 의견 : 네, 당신이 맞다고 생각합니다. 기능적 언어에 대해 더 배워야 할 것 같아요!
Michael K

1
@ moz : 예, Java에 람다가 있었으면 좋겠습니다. 익명의 Thread개체는 ... 서투른입니다.
Michael K

9

학습 어떤 프로그램의 다른 패러다임은 일반적으로 프로그래밍 능력을 향상하게 될 것입니다. 학문적 연구 수준의 자료가 아니거나 프로그래밍이 아닌 경우 프로그래밍은 기본적으로 문제 해결입니다. 한마디로 생각하십시오. 다양한 패러다임은 문제와 해결책에 대해 생각하는 방식이 다릅니다. 따라서 "기능 언어 학습"으로 생각하지 마십시오. "문제와 해결책을 생각하는 다른 방법을 배우는 것"으로 생각하십시오. 그런 다음 실제로 사용하지 않아도 언어를 학습하면 얻을 수있는 이점이 있습니다.

귀하의 특정 질문을 해결하기 위해, 나는 yore 시절 (C ++에 대한 표준이 있기 전에)에 C ++ 프로그래머였습니다. 나는 메소드 등으로 조작 된 상태를 유지하는 객체로 모든 평범한 것들을 따랐다. 그리고 나는 Haskell을 우연히 발견하고 그것을 많이 배웠다. (나는 누구도 진정으로 Haskell을 배우지 않는다고 생각합니다.) 내 그룹에 할당 된 테스터 인 내 동료 중 한 명이 내 코드를 테스트하기가 쉬워 졌다는 의견이 나올 때까지이 연습은 약간 낭비되었습니다.

일어난 일은 객체를 점점 더 불변하게 만들기 시작했다는 것입니다. 복잡한 변경 가능한 상태의 클래스가 변경 사항으로 자신을 복제 한 클래스로 바뀌기 시작하여 새 객체를 반환했습니다. 공유 객체는 COW (Copy-On-Write) 시맨틱이있는 객체로 대체되기 시작했습니다 (따라서 메모리 오버 헤드없이 많은 객체 복제본의 환상을 제공함). 기능은 반드시 필요한 경우가 아니면 부작용이 없었습니다. "함수"의 순수하고 수학적 정의는 점점 더 표준이되었습니다. 이 모든 것이 내 코드에서 자연스럽게 일어나기 시작했습니다. 의식적인 생각은 전혀 없었습니다. 점점 더 많은 기능적 프로그래밍 공간을 탐색했습니다.

이제 저는 2 년마다 하나 이상의 새로운 프로그래밍 패러다임을 배우는 것을 목표로하고 있습니다 (AOP와 같은 작은 확장 패러다임 일지라도) 각 패러다임 내에서 최소한 2 개의 새로운 언어 (가능한 한 순수하고 하나는 하이브리드 / 실용적 임) ). 각 언어는 모든 언어로 모든 프로그래밍에 적용 할 수있는 새로운 지적 도구를 제공했기 때문에 학습에 소요되는 시간이 다소 낭비되지는 않았습니다.


3

전에도 말했지만 기능 언어를 배우면 C #이 확실히 향상되었습니다. 그것은 람다를 이해하는 데 도움이되었습니다. 또한 비동기 작업으로 작업 할 때 함수형 프로그래밍 (F #)을 얼마나 선호하는지 알게되었습니다!


3

머신 코드는 부작용 목록에 지나지 않습니다. 명령은 프로세서에 의해 직접 실행됩니다. C의 부작용은 레지스터와 물리적 하드웨어를 처리하는 것이 아니라 추상화 세트를 처리하고 컴파일러가 모든 더러운 작업을 수행하게합니다. C를 사용하면 부작용을 루프와 if 문으로 구성 할 수도 있습니다. C ++는 언어에 OOP 및 필요한 기능을 추가하여 C를 향상시킵니다. Java 및 C #은 가비지 콜렉션을 추가하고 Python은 동적 입력을 추가합니다.

이러한 모든 기능 (동적 타이핑, 가비지 수집 등)을 사용하더라도 이러한 언어의 프로그램은 여전히 ​​전적으로 부작용을 기반으로합니다. Scheme, Clojure, Haskell 및 ML과 같은 기능적 프로그래밍 언어는 완전히 다른 것입니다. 이러한 언어는 수학에 가깝고 기계 코드에 더 가깝습니다. 오히려 부작용을 사용하여 함수 주위에 값을 전달합니다.

덜 복잡한 언어의 기술 향상을 목표로 배울 수있는 좋은 언어는 무엇입니까?

Scheme을 권장 합니다 . 최소한이며 MIT의 오래된 입문 프로그래밍 클래스에서 사용되었습니다. 다른 기능 프로그래밍 언어는 배우기가 훨씬 어렵습니다. Clojure는 Java의 모든 복잡성을 제공하고 ML은 복잡한 정적 유형 시스템을 제공하며 Haskell은 때로는 학문적 언어로 지칭되기 때문에 초보자에게는 이상적이지 않습니다. 반면에 계획은 배우고 이해하기 쉽습니다.

프로그래밍 기술을 향상시키는 방법은 무엇입니까?

거의 모든 고급 프로그래밍 언어에는 기능과 재귀 (기능적 프로그래밍의 기반이되는 개념)가 있습니다. FP에 대한 지식은 거의 모든 곳에서 도움이되어야하지만, 실제로 기능적으로 프로그래밍하려면 자연스럽고 효율적인 언어를 사용해야합니다. 대신 다른 사람의 언어 디자인을 원하는대로 구부려 야합니다. 기능적 프로그래밍 언어를 사용하여 기능적 프로그래밍을 수행해야합니다.

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