SmalltalkBestPracticePatterns:7.6

From 흡혈양파의 번역工房
Jump to: navigation, search
7.6 Guard Clause (보호문장절)

Guard Clause (보호문장절)

Indented Control Flow(p.175)를 이용해 표현식을 작성하고 있다.

  • 조건(condition)이 지속되는 경우 실행되어선 안 되는 코드는 어떻게 포맷팅하는가?


Fortran 프로그래밍이 사용되던 오래 전, 다수의 엔트리를 갖고 단일 루틴으로 출구(exit)가 가능하던 시절에는 제어 흐름을 추적하기란 악몽과 같았다. 루틴에서 어떤 statement가 실행되는지, 언제 실행되는지는 정적으로 결정하기가 불가능했다. 이는 "모든 루틴은 하나의 엔트리와 하나의 출구를 가진다,"라는 명령으로 이끌었다.


스몰토크가 먼 옛날 Fortran과 동일한 제약으로 시달린 적은 거의 없지만 다중 출구의 금지는 지속되었다. 루틴이 몇 개의 행만으로 구성된 경우, 루틴 내에서 제어의 흐름을 이해하기란 간단하다. 관심의 대상이 된 것은 바로 루틴들 간 흐름이다.


다중 리턴은 코드의 포맷팅, 그 중에서도 특히 조건문(conditionals)을 간소화할 수 있다. 게다가 메서드의 다중 리턴 버전은 종종 프로그래머의 의도에 대한 좀 더 직접적인 표현식이다. 따라서:


  • 명시적 리턴으로 one-branch 조건문을 포맷팅하라.


장치가 이미 연결되지 않았을 때에만 통신장치를 연결하는 메서드가 있다고 치자. 출구가 하나인 메서드 버전은 아래와 같을 것이다:

connect
    self isConnected
        ifFalse: [self connectConnection]


이는 "아직 연결되지 않았다면 내 연결을 연결시켜라,"는 의미로 읽을 수 있겠다. 동일한 메서드의 문장보호절(guard clause) 버전은 아래와 같다:

connect
    self isConnected ifTrue: [^self].
    self connectConnection


위는 "내가 연결되어 있다면 아무 것도 하지마라. 내 연결을 연결시켜라,"고 읽을 수 있다. 문장보호절은 따라야 하는 제어 경로보다는 사실(fact)에 대한 statement 또는 불변식(invariant)에 가깝다.


Notes