Clean Code의 원칙을 기능적 언어에 적용


17

나는 현재 Robert Martin의 Clean Code를 읽고 있습니다. 나는 그것이 훌륭하다고 생각하고 OO 코드를 작성할 때 그의 교훈을 마음에 새깁니다. 특히, 의미있는 이름을 가진 작은 함수를 사용하라는 그의 조언은 내 코드 흐름을 훨씬 더 매끄럽게 만든다고 생각합니다. 이 인용문에 의해 요약되는 것이 가장 좋습니다.

[W] e는 마치 현재의 추상화 레벨을 설명하고 다음 레벨에서 다음 TO 단락을 참조하는 TO 단락 세트 인 것처럼 프로그램을 읽을 수 있기를 원합니다.

( 37 페이지 클린 코드 : "TO 단락"은 부정사로 발음 된 문장으로 시작하는 단락입니다. "X를 수행하려면 단계 Y 및 Z를 수행합니다." "Y를 수행하려면 ..."등 ) 예를 들면 다음과 같습니다.

RenderPageWithSetupsAndTeardowns를 사용하기 위해 페이지가 테스트 페이지인지 확인하고, 그렇다면 페이지와 설정을 포함합니다. 두 경우 모두 HTML로 페이지를 렌더링합니다

나는 또한 직업을위한 기능 코드를 작성한다. 이 책에있는 Martin의 예제는 마치 마치 단락 세트 인 것처럼 분명하게 읽히지 만 매우 분명합니다. 그러나 "문단 세트처럼 읽음"이 기능 코드에 바람직한 품질인지 확실하지 않습니다. .

Haskell 표준 라이브러리 에서 예를 들어 보자 .

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

그것은 마틴의 조언에서 얻을 수있는 한 멀지 만 간결하고 관용적 인 하스켈입니다. 그의 책에있는 자바 예제와는 달리, 나는 그가 요구하는 종류의 케이던스가있는 것을 리팩토링하는 방법을 상상할 수 없다. Clean Code 의 표준으로 작성된 Haskell 은 오래 걸리고 부자연 스럽습니다.

함수형 프로그래밍 모범 사례와 충돌하는 클린 코드 (최소 일부)를 고려하는 것이 잘못 되었습니까? 그가 다른 패러다임에서 말한 것을 재 해석하는 합리적인 방법이 있습니까?


1
함수형 프로그래머는 지나치게 간결한 코드를 작성하는 경향이 있습니다. 그래도 해당 환경에서도 모범 사례를 원격으로 고려하지는 않습니다.
Telastyn

무지를 용서하지만 TO 단락은 무엇입니까?
Shashank Gupta

4
최근 다른 질문에서 언급했듯이 Dijkstra는 "자연 언어 프로그래밍"의 어리 석음에 대해 썼습니다. 나는 산문처럼 읽는 코드가 파이프 꿈이라는 데 동의합니다. 저는 이것이 하스켈에서 특히 사실이라고 생각합니다. 순수한, 효과를 내기 위해 일련의 단계가 아닌 값들 사이의 평등을 상징적으로 표현합니다. 인용 된 코드가 관용적이라는 것이 중요하다고 생각합니다. 예를 들어 xs나쁜 이름이지만 i루프 변수 처럼 함수형 언어에서 일반적입니다 .
Doval

@ShashankGupta 나는 밥 삼촌이 쓴 것에 대한 내 자신의 이해뿐만 아니라 책의 특정 페이지에 대한 링크로 질문을 편집했습니다.

@ShashankGupta 그는 몇 가지 예를 제시하지만 아이디어는 산문처럼 읽어야한다는 것입니다. "목록의 최대 값을 찾으려면 모든 요소를 ​​확인하십시오 ..."
Patrick Collins

답변:


11

Clean Code는 무엇보다도 스타일 매뉴얼입니다. 클링 온에서 글을 쓰는 경우 Strunk and White 는 적용되지 않습니다. 아이디어는 코드를 읽을 가능성이있는 프로그래머에게 명확하게 알고 싶다는 것입니다. 모듈화되고 재구성하기 쉬운 코드를 원합니다. Haskell에는 다른 언어로이 작업을 수행 할 수있는 방법이 있지만 정확한 내용은 다를 수 있습니다.

그러나 Haskell에는 다양한 스타일 가이드 라인 이 있습니다. 스택 오버플로에는 상당히 포괄적 인 가이드 도 있습니다. 코딩 로직을 간단하고 간단하게 유지하는 것은 상당히 일정 해 보입니다. 기능의 일반화는 모듈화로 이어 지므로 강조됩니다. Clean Code와 마찬가지로 DRY 코드도 강조됩니다.

결국 Clean Code와 Haskell의 코딩 지침은 같은 일을 위해 노력하지만 자신의 길을 가고 있습니다.


1
이 답변은 Clean Code가 가르치는 원칙을 언어에 매우 적용 할 수 있으며 원칙적으로 질문 된 질문의 핵심이라고 생각합니다. 사람들이 Clean Code 를 스타일 매뉴얼로 생각하는 이유를 알 수 있으며 , 이것이 부분적으로 사실이지만 책 전체를 하나로 무시할만큼 사실이 아니라고 생각합니다.
Allan

나는 Martin의 Clean Code 책을 스타일 매뉴얼로 생각하지 않습니다. 저는이 책의 가르침이 실제로 스타일 가이드와 디자인 패턴 사이 어딘가에 있다고 생각합니다.
Michael R

16

나는 당신의 모범이 의미하는 바를 따르지 않을 것입니다. 문단은 그들이 묘사 한 것처럼 긴 바람이 필요하지 않습니다. 그는 코드가 영어처럼 읽히는 것을 의미하지는 않습니다. 중요한 부분은 논리적 진행에서 동일한 추상화 수준에서 기능을 그룹화하는 것입니다. 그것은 프로그래밍 패러다임을 초월하는 이론적 구조적 개념입니다.

Bob Martin의 "TO 단락"형식으로 표현하면 다음과 같이 예제를 읽습니다.

  • 를 계산하려면 maximumBy순서 함수와 목록이 필요하며 결과는 해당 목록의 요소입니다.
  • maximumBy비어있는 목록과 순서 함수 를 계산하는 것은 오류입니다.
  • maximumBy목록 을 계산하려면 함수를 xs사용하여 해당 목록을 접습니다 maxBy.
  • maxBy두 목록 요소 중 하나 를 계산하려면 주어진 순서 함수를 사용하여 비교하십시오. 첫 번째 요소가 더 큰 경우 선택하십시오. 그렇지 않으면 두 번째를 선택하십시오.

가장 일반적인 개념부터 시작하여 명령 예제와 같이 더 자세하게 진행합니다. "TO 단락"의 개념은 페이지를 위아래로 이동하지 않고도 충분히 자세하게 읽을 때 특정 지점에서 읽기를 중지 할 수 있다는 것입니다. 확실히 여기에 해당합니다.

두 개의 이름이 더 나을 수도 있지만, 일반적으로 고차 함수를 작성할 때 언어의 일반적인 규칙입니다. 고차 함수 이름은 동사의 관계를 더 자세히 설명하기 때문에 책의 예와 같은 명령형 동사 구로 잘 번역되지 않습니다.

"TO 단락"지침을 따르지 않는 방법을 구현할 수 있습니다. 명시 적 형식 서명을 생략하면 더 높은 수준의 "개요"문장이 생략됩니다. 패턴 일치 대신 오류 처리에 if 식을 사용할 수 있습니다. 이는 다른 추상화 수준과 부적절하게 혼동 될 수 있습니다. maxBy나중에 자세히 설명 할 수있는 이름을 부여하는 대신 익명 함수로 인라인 할 수 있습니다.

실제로, where실제로 같은 구문 은 단락 형식에 적합 하다고 생각합니다.이 구문 을 사용하면 영어로 표현하는 방식과 비슷한 방식으로 더 자세하게 이름을 지정할 수 있으므로 범위를 제한합니다. "문단"의 맥락에 명확한 방법.

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