함수형 프로그래밍으로 코드가 복잡해 집니까? [닫은]


17

작년 한 해 동안 나는 스칼라 코드를 작성 했습니다 (자바 배경에서 나옴 ). Val, case 클래스, map / filter / lambda 함수, 암시 적 및 형식 유추를 사용하여 더 간단하고 깔끔한 코드를 만드는 방법이 정말 마음에 들었습니다. 나는 주로 Akka 기반 응용 프로그램에 사용했습니다 .

올해 저는 기능 프로그래밍을 정말 좋아하는 새로운 팀과 함께 스칼라 프로젝트를 진행하고 있습니다. 그들은 Scalaz를 많이 사용 하며 코드는 응용 프로그램, 컨텍스트 범위, 리더 / 라이터 / 상태 모나드로 어디에나 채워져 있으며 주요 방법조차 I / O 모나드에 "랩핑"되어 있습니다. 그들의 추론은 이것이 컴파일러가 코드가 정확하고 각 함수에 부작용이 없다고 주장하는데있어 "우리를 위해 일하게"한다는 것이다.

그럼에도 불구하고, 내 관점 에서이 모든 구문은 실제로 비즈니스 논리를 방해합니다. 예를 들어 "MyBusinessObject"유형은 "List [MyBusinessObject]", "Option [MyBusinessObject]"또는 "Future [MyBusinessObject]"와 같은 유형도 좋습니다. 그들은 모두 명확한 의미와 목적을 가지고 있습니다. 반면에 코드는 다음과 같습니다.

def method[M[_]: Applicative] = {
  case (a, b) => (ca[M](a) |@| cb[M](b)) {
    case t @ (ra, rb) =>
      if (ra.result && rb.result) t.right
      else t.left
  }
}

프로그램에 복잡성을 추가합니까, 아니면이 프로그래밍 방식에 익숙하지 않은 것이 저입니까?


6
객관적으로 대답 할 수있는 질문은 무엇입니까?
사슴 사냥꾼

1
하나 또는 두 개의 문자 변수 이름을 가진 많은 코드로 이어지는 것처럼 보입니다. APL처럼 보입니다. 그것은 보완이 아닙니다.
user949300

3
작년에 Haskell과 게임을 시작했습니다. 그것은이 같은 짧은 상징적 인 기능을 많이 가지고 있다는 점에서 내가 .. 하스켈은 Scalaz 유사하다 등 태닝, 펑, 모나드, 같은 개념을 이해하지 않았을 때, 시간에 매우 복잡한 모습 >>=<$>, 평균 어떤 것도 당신까지 그들이하는 일을 알아 그러나 그들이 의미하는 바를 배운 후, 그들은 지금 매우 자연스럽고 빠르게 읽습니다. 실제로 대답이 아니라 이와 같은 것들에 대한 객관적인 경험. Scala도 사용하지만 Scalaz 라이브러리에 대한 경험이 없습니다.
KChaloux

3
당신은 관용구에 익숙하지 않습니다. @ user949300 짧은 변수는 많은 기능 코드에서 실제로 문제가되지 않습니다 (수학 스타일 규칙에 대해 생각하십시오!). 의미, 유형 또는 자세한 변수 이름을 더 잘 전달하는 것에 대한 자세한 내용은 Tony Morris 블로그를 참조하십시오.
Andres F.

3
@ user949300 : 짧은 변수 이름은 로컬에서 선호되며 기능 및 명령 세계에서는 동일합니다 ( for(i=0; i<7; ++i) { trivialOperation(i); }어색한 trivialOperationCount변수로 작성하지 않겠습니까?). 패턴 일치 기능을 갖춘 함수형 프로그래밍 언어는 때때로 더 많은 변수를 도입합니다. OO에서 접근 자 메서드 호출을 작성하십시오. 결과는 일반적으로 더 간결합니다. 아마도 좀 덜 자명하지만 데이터 선언을 찾아 보면 일반적으로 명확 해집니다. 정적 타이핑은 많은 도움이됩니다. APL과는 다릅니다.
leftaroundabout

답변:


37

이것은 함수형 프로그래밍과 는 아무런 관련이 없습니다. 다른 프로그래밍 언어와 관련하여 이런 상황을 찾을 수 있습니다. "그들의"언어의 고급 구문을 너무 좋아하는 개발자는 가독성에 대한 상식을 무시하고 단순하게 유지하는 개발자입니다. C, C ++, Perl, Java, C #, Basic 및 기타 비 기능적 언어에서 이러한 상황이 발생했습니다. 프로그래머에게는 복잡한 코드를 추가하는 기능 프로그래밍이 아닙니다.

잘못 이해하지 마십시오. 고급 언어 기능을 사용하지 않는 것이 좋습니다. 그러나 주어진 상황에서 올바른 균형을 찾는 것이 중요합니다. 전 세계 10 만 명 이상의 개발자가 사용할 수있는 일반 라이브러리를 작성할 때는 지역 사무소에 대해서만 개별 보고서 생성기를 작성할 때 적용 할 수있는 방법이 다릅니다.


7
또한 커뮤니티와 많은 관련이 있습니다. Java 또는 C # 배경을 가진 개발자의 경우 코드를 거의 이해할 수 없으며 커뮤니티도 코드를 이해할 수 없습니다. 그러나 예를 들어 Haskell을 작성하고 모나드, 응용 프로그램, 펑터 등을 사용하지 않으면 해당 언어 커뮤니티를 당황하게합니다. 코드의 "자연 스러움"은 고유 한 것이 아니라 커뮤니티 및 확립 된 관행과 관련이 있습니다.
Andres F.

1
우리 대부분은 명령적인 배경에서 왔기 때문에 자연스럽지 않은 것에 대해 잘못된 가정을하게되기 때문에보기가 어렵습니다.
Andres F.

SLT C ++ 라이브러리를 살펴보면 아마추어가 훨씬 더 읽기 편하도록 작성 될 수 있습니다.
ratchet freak

@ratchetfreak : STL을 의미한다고 생각합니다. 나는 이것이 매우 좋은 예라고 생각합니다 (실제로 나는 이것을 내 마음에 생각했습니다). 템플릿 메타 프로그래밍을 사용하면 STL 프로그래머라면 STL을 더 재사용 할 수 있기 때문에 의미가 있습니다. 이 코드를 유지 관리해야하는 사람들은 일반적으로 템플릿 메타 프로그래밍에도 사용됩니다. 표준 비즈니스 응용 프로그램 전체에서 STL과 유사한 방식으로 템플릿 메타 프로그래밍을 사용하면 코드가 지나치게 복잡하고 유지 관리하기 어려워 질 수 있습니다. 비즈니스 응용 프로그램이나 cours에서도 TMP가 좋은 경우는 드물게 있습니다.
Doc Brown

@DocBrown 그렇습니다. 난독증은 잘못된 시간에 시작되었지만 솔직히 (그리고 지금보다 훨씬 더 많은 시간을) 생각하면 많은 기능 본문을 훨씬 더 읽기 쉽게 다시 작성할 수 있습니다.
ratchet freak

7

나는 그들이 코딩하는 방식에 적어도 익숙하지 않다고 말하고 싶습니다. 나는 C #에서 F #으로 와서 Haskell 배경을 가진 사람들과 함께 일하는 것과 비슷한 상황에 처해 있으며 재미있는 경험을 발견하는 동안 벽에 머리를 대고 엉키지 않는 순간이 있습니다. 특히 복잡한 점이없는 함수 구성으로 인해 진행중인 작업을 중단 할 수 있습니다. 문화적인 것입니다.

이 특정 코드가 프로그램에 복잡성을 추가하는지 여부는 알 수 없습니다. 일반적인 코드 조각 자체가 복잡 할 수 있다는 데 동의했습니다. 그러나 이것은 비즈니스 로직의 일부가 아닌 유틸리티입니다. 그것이 코드베이스를 더 복잡하게 만들거나 더 단순하게 만들고 있는지 알고 싶다면, 그 코드없이 어떻게 보일지 상상해야 할 것입니다. 일반적으로 이러한 일반적인 구성이 복잡한 경우가 많지만 단일 화면에 맞출 수있는 복잡성입니다. 동시에 전체 코드베이스를 상당히 단순하게 만듭니다. 이것은 특히 모나드의 경우입니다.

그런 다음 @Doc Brown이 제안한 것처럼 '예술을위한 예술'의 사례가 될 수도 있습니다. 어느 것도 배제 할 수 없습니다.


5

나는 일반적으로 함수형 프로그래밍에서 변경 가능한 상태를 제거 함으로써 복잡성을 줄임으로써 코드 섹션의 작동 방식을 이해하려고 할 때 고려해야 할 사례 수를 줄인다고 주장합니다.

그러나 함수형 프로그래밍은 더 높은 수준의 추상화를 가능하게하며, 매우 추상적 인 코드는 매우 유용 할 수 있지만 이해를 돕기 위해 일반적으로 사용하는 컨텍스트와 정의가 다르기 때문에 이해하기 어려울 수도 있습니다. 비즈니스 객체에 대한 "모두 명확한 의미와 목적을 가지고 있습니다"라는 의견은 의심 할 여지없이 사실이지만, 그 논리가 이미 이해하고있는 필요와 맥락에 매우 구체적이라는 사실을 반영한 것입니다. Monad와 같은 구문이 있으면 약간의 노력으로 무언가를 매우 유용하게 만들 수 있지만 웹에는 Monad가 무엇인지 설명하려는 페이지가 흩어져 있습니다. 그것은 당신을위한 추상화입니다.

또한 Scalaz는 FP를 오랫동안 먹고 호흡 한 사람들이 작성했습니다. 그들은 Haskell에서 사용할 수있는 기능을 Scala로 가져오고 싶었습니다. 그렇게하면서 그들은 교육학적인 시도를하지 않았다. 스칼라 즈 (Scalaz)는 어휘와 스타일을 사용하여 저자에게는 명확하고 솔직 해 보이지만 미숙 한 사람에게는 외계인입니다. 우리의 나머지 사람들에게 당혹스러운 방법은 저자에게 하스켈 배경을 감안할 때 너무 분명해 보였으므로 의견을 보증하지 않았습니다.

또한 기능적 프로그래밍 언어 인 Scala에는 Scalaz 작성자가 경우에 따라 못생긴 코드를 작성 해야하는 단점이 있습니다 (일부 JVM에는 단점이 있기 때문에). 예를 들어 일반적인 테일 콜 제거 기능이 없으면 일부 코드에서 트램펄린을 사용해야하며 "종류 시스템"이 없으면 형식 서명이 복잡해질 수 있습니다.

그리고 마지막으로, Scalaz는 그 자체를 잘 활용합니다. 그것은 그것의 힘의 표시로 생각할 수 있지만, 시작되지 않은 사람들에게는 소스를 퍼즐로 만들 수 있습니다-당신이 보는 임의의 코드 조각은 당신에게 외계인으로 보이는 다른 것을 사용할 것입니다.

잠깐만 그리고 이것은 도움 될 수 있습니다.


-4

프로그램에 복잡성을 추가합니까, 아니면 이런 프로그래밍 방식에 익숙하지 않은 것입니까?

왜 이러한 가능성이 같지 않다고 생각합니까?

잘 작성된 코드는 특정 프로그래밍 언어에 익숙하지 않은 사람들이 읽을 수 있습니다. 어떤 언어 (BASIC, Pascal 등)는 프로그래밍 언어를 전혀 본 적이없는 학교 학생들이 읽고 이해할 수 있습니다.

다른 언어에 대한 경험과 스칼라에 대한 경험이있는 사람 (그리고 내가 일주일 이상 Scalaz와 함께 일했으며 더 까다로운 일을 설명 할 동료가 있다고 생각하는 사람)이 여전히 혼란 스러울 경우; 그것이 복잡성을 더했다는 증거입니다.


11
이것은 사실이 아닙니다 :"Well written code can be read by people who aren't familiar with the specific programming language."
Andres F.

@Andres : 사실입니다 ... 잘 작성된 코드는 비즈니스 로직을 구현 세부 사항과 분리하며 비즈니스 로직은 읽을 수 있어야합니다. 대부분의 작업은 잘 알려진 헬퍼 함수를 ​​직접 호출하기 때문입니다. 이러한 도우미는 물론 모든 종류의 언어 기능을 사용할 수 있으며 이해하기 위해 언어 및 라이브러리에 대한 많은 경험이 필요합니다.
벤 Voigt

4
나는 다음이 관용적 인 APL이라고 믿는다 x[⍋x←6?40]. 어떻게 생각하십니까? 나는 알지 못했을 것이다…
bdesham

3
@Brendan 같은 패러다임 안에서만 (그리고 때로는 그렇지 않을 수도 있습니다). 예를 들어, Prolog, Java 및 APL은 매우 다르기 때문에 다른 언어가없는 언어 중 하나만 알고 있으면 첫 번째 언어를 얼마나 잘 알고 있더라도 다른 두 언어를 읽을 수 없습니다. (확실히, bdesham의 예에서, APL을 모른다면 악마가 어떻게 "크리스마스 트리"를 해석해야합니까?)
Izkata

1
브렌든, 잘 쓰여진 정의는 비표준입니다. 잘 쓰여진 것은 항상 언어와 공동체와 관련이 있습니다. 언어 X의 프로그램은 버그가 없다면 잘 작성되었으며, 효율적이고 명확합니다. 이것은 일반적으로 서면 언어에 적용됩니다. 항상 청중을 아십시오. 과학 논문에 적합한 것은 아마도 엄마에게 보내는 이메일에 적합하지 않을 것입니다.
Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.