기능적 프로그램 구성 방법


41

가능한 중복 :
기능적 프로그래밍 대 OOP 기능적 프로그래밍으로
관리 가능한 코드를 작성하는 방법?

OOP에서 코드의 기본 구성 단위는 클래스입니다. Java, C # 및 유사한 언어에서 자주 사용되는 방법은 클래스 이름 뒤에 파일 이름이있는 각 클래스에 대해 하나의 파일을 갖도록 코드를 구성하는 것입니다.

이러한 각 클래스를 단일 개념을 그룹화하기위한 조직 단위로 고려할 수 있습니다.

이러한 클래스는 솔루션 / 프로젝트에서 파일의 디렉토리 구조를 따르는 네임 스페이스에 있습니다. 네임 스페이스는 조직의 또 다른 수준입니다.

기능적 언어로 된 대규모 프로젝트는 일반적으로 어떻게 구성됩니까?

함수를 다른 파일로 나누는 방법을 결정하는 방법은 무엇입니까?

파일 옆에 다른 그룹화 단위가 사용됩니까?

코드는 일반적으로 단일 파일 내에서 어떻게 구성됩니까?


18
@ S.Lott What's stopping you from...하스켈 코드가 정신적으로 계산하지 않는 시점까지 완전히 다른 사고 방식을 가진 수년간의 프로그래밍. 물론 당신이 진짜 프로젝트가 항상 정확하고 깔끔하게 정리되어 있다고 가정합니다 (아마도 그들이하지만 어떻게 나 같은 놈 알고 있어요?)
야 니스

13
@ S.Lott : 나는 항상 OOP로 프로그래밍했습니다. 나는 최근에 호기심에서 기능적 언어를 다루기 시작했습니다. "왜 여기서 물어봐?"라고 말합니다. A :이 주제에 대해 저를 밝힐 수있는 경험이있는 사람들 (또는 사이트에서 제공하는 전문가)로부터 멘토링과 통찰력을 얻는 것. 이 사이트의 목적이 아닙니까? 모든 프로그래머 또는 SO 질문에 "응답하지 않는 이유는 무엇입니까?"라고 대답 할 수 없습니까? 대답은 '그렇다'입니다. 그러나 질문을하는 이유는 해당 주제의 전문가 인 사람으로부터 더 나은 결과를 얻는 것입니다.
Gilles

5
@ S.Lott : 무작위 코드를 읽는다면, 그들이 결정한 조직의 결정이 좋은지 나쁜지 어떻게 알 수 있습니까? 그리고 왜 좋은지 나쁜지?
Carson63000


4
@ S.Lott 요약하면 언어 또는 패러다임 전문가가 잘 조직 된 프로젝트를 식별하고 조직에 존재할 수있는 약점 / 결점을 식별하며 코드를 읽고 조직을 보는 것보다 훨씬 더 가치있는 이유를 설명합니다. 잘 구성되어 있다고 가정합니다.
Thomas Owens

답변:


32

나는 이것이 언어에 달려 있다고 생각합니다. 함수형 프로그래밍에 관해서는, 나는 주로 Haskell을 다루었습니다. 그래서 나는 그것이 어떻게 작동하는지 설명 할 것입니다.

Haskell 코드는 기본적으로 함수와 데이터 유형의 모음 인 "모듈"로 구성됩니다. 각 모듈은 단일 파일입니다. 모듈은 Java 클래스와 Java 패키지를 혼합 한 것으로 모듈이 수행하는 작업의 정확한 범위가 다릅니다. 또한 모듈은 내보낼 함수 및 형식 생성자와 숨길 함수를 제어합니다. 이것은 Java private와 비슷합니다 public.

내 프로그램에서 나는 모듈이 의미 적으로 가지 일 을하는 것을 좋아한다 . 이것은 여러 데이터 유형을 정의 할 수 있다는 점을 제외하고는 Java 클래스처럼 만듭니다. 와 같은 표준 라이브러리에서 사용하는 모듈 Data.List은 패키지와 비슷합니다. 유사한 유틸리티 기능을 제공합니다. 이것도 같은 정적 Java 클래스와 매우 유사합니다 java.util.Arrays.

모듈은 명확성을 위해 중첩 될 수 있다는 점에서 Java 패키지와 비슷합니다 (코드 자체에 영향을 미치지 않는다고 생각합니다). 일반적으로 단일 프로젝트의 경우 이름 (예 :)을 지정 Project하고 모든 모듈을 여기에 포함시킵니다 (예 : Project.ParseProject.Run). 응용 프로그램보다 라이브러리와 유사한 코드를 작성하는 경우 Data.List또는 수행중인 작업을 기반으로 코드를 구성합니다.Control.Monad . 다른 언어와의 한 가지 주요 차이점은 Haskell이 IO를 제한하고 한곳에 모두 넣도록 권장한다는 것입니다. 많은 수의 모듈이 IO를 전혀 사용하지 않으며 주어진 프로젝트에 대해 가능한 많은 모듈을 순수하게 사용하고 싶습니다.

예를 들어, 나는 TPL이라고 부르는 간단한 프로그래밍 언어를 사용하고 있습니다. 이를 위해 TPL.Parse언어의 내부 표현과 구문 분석 방법을 정의 TPL.Run하고 인터프리터를 실행하고 변수와 IO를 처리 하는 두 가지 간단한 모듈을 만들었습니다 . 실제로 코드를 컴파일하고 실행하기 위해서는 일반적으로 Main프로그램의 시작점이되는 모듈이 있습니다.

파일 내에서 기능을 구성하는 데 상당한 자유가 있습니다. 이것은 내가 좋아하는 것입니다. 다른 곳에서 사용하기 전에 데이터 유형을 맨 위쪽으로 정의합니다. 데이터 유형을 정의한 직후, 적절한 유형 클래스의 일부로 만드는 데 필요한 모든 것을 구현합니다. 이것은 인터페이스를 구현하는 것과 같습니다. 그런 다음 논리와 다양한 도우미 기능을 적절하게 따릅니다. 마지막으로 모든 IO 기능을 맨 아래로 끝내고 싶습니다 main. 이를 통해 IO가 수행하는 작업과 프로그램이 시작되는 위치를 정확하게 알 수 있습니다.

요약하자면, 기능은 모듈에 포함되어 있으며 각 기능은 단일 파일로 구성됩니다. 여러 모듈이 프로그램이나 라이브러리를 구성 할 수 있습니다. 전자는 일반적으로 Main진입 점 인 모듈을 포함합니다 . 파일에는 구성에 대한 여러 가지 옵션이 있지만 데이터 유형을 맨 위, 맨 아래 IO 및 중간 논리를 그룹화하는 것을 선호합니다.

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