SmalltalkBestPracticePatterns:7.4

From 흡혈양파의 번역工房
Jump to: navigation, search
7.4 Indented Control Flow (들여쓴 제어 흐름)

Indented Control Flow (들여쓴 제어 흐름)

  • 메시지는 어떻게 들여쓰는가?


이 패턴 덕분에 few line과 short line을 모두 생성해야 하는 포맷팅의 상충된 요구와 관련해 한시름 놓게 되었다. 이 패턴의 유일한 장점은 Composed Method가 메서드에서 수백 또는 수천 개의 단어를 절대로 다루지 않아도 되게 해주는 최소한의 기능을 가진 메서드들을 생성한다는 점이다.


한 가지 극단적인 방법으로, 메서드 길이가 얼마나 길든 상관없이 동일한 행에 모든 키워드와 argument를 위치시키는 방법이 있다. 이는 메서드의 길이는 최소화하지만 읽기가 힘들다.


메시지에 다수의 키워드가 있는 경우 모두 표시된다는 사실은 스캐닝 리더(scanning reader)로 재빨리 전달하는 데에 중요하다. 자체 행에 각 키워드/argument 쌍을 위치시킴으로써 당신은 독자가 복잡한 메시지의 존재를 쉽게 인식하게 해준다.


Arguments는 키워드와 달리 정렬이 필요 없는데, 독자들이 모든 argument를 스캔하는 일은 거의 없기 때문이다. Arguments는 그들의 키워드 컨텍스트에서만 흥미롭다.


  • zero 또는 one argument 메시지를 그들의 수신자와 동일한 행에 넣어라. 2개 또는 그 이상의 키워드로 된 메시지의 경우 각 키워드/argument 쌍을 자체 행에 넣고 한 탭만큼 들여 써라.


Indented Control Flow로 포맷팅된 zero와 one argument 메시지는 아래와 같다:

foo isNil
2+3
a < b ifTrue: [...]


Indented Control Flow로 포맷팅된 two argument 메시지는 아래와 같다:

a<b
    ifTrue: [...]
    ifFalse: [...]
array
    at: 5
    put: #abc


많은 사람들이 ifTrue:와 whileTrue:와 같은 제어문의 포맷팅에 대한 복잡한 예외를 갖고 있다. 필자가 이 패턴을 그토록 좋아하는 이유 중 하나는 조건문을 또 다른 메시지 전송으로 (결국은 그러한 기능을 한다) 취급하면서 합리적인 결과를 제공한다는 점이다.


이와 같은 코드의 포맷팅은 전체 선택자를 읽기 수월하게 만든다. 이 예제에서 메시지는 #copyFrom:to:with:startingAt:임을 쉽게 읽을 수 있다:

aCollection
    copyFrom: 1
    to: aString size
    with: aString
    startingAt: 1


Rectangular Block(p.177)은 블록을 포맷팅한다. Guard Clause(p.178)는 들여쓰기가 페이지를 넘어가지 않도록 해준다.


Notes