Eternity's Chit-Chat

aeternum.egloos.com



유연한 설계를 위한 패턴과 원리 - 3.리팩토링을 통한 진보 5부 Supple Design

PATTERNS & PRINCIPLES

ASSERTION

컴퓨터 프로그래밍이라는 것을 처음 배우기 시작하던 시절에 x = x + 1이라는 문장을 보고 의아하게 생각했던 기억이 있다. 어떻게 x 1 더한 값이 x 같을 있지? 당황스러웠던 것은 프로그램 내의 함수 f 대해 f(x) = y이고 f(x) = z 경우 y z 다른 값일 있다는 사실이었다. 별다른 배경지식이 없었던 당시에는 그저 프로그래밍과 수학에서 말하는 함수가 이름은 같지만 정의에 있어서는 미묘한 차이가 있는 것이라고 막연하게 추측했던 같다.

그리고
x = x + 1이라는 문장이 에러라고 생떼를 쓰는 프로그래밍 언어를 보고 다시한 당혹감에 빠져 들었다. x 1 더한 값을 x 대입하는데 에러가 나는거지? 짜증이 났던 것은 f(x) = y이고 f(x) = z 무조건 y z 같도록 프로그래밍을 짜야 한다는 사실이었다.

여기에서
예로 방식의 가장 차이점은 부수 효과(side effect) 존재 유무다. 부수 효과를 기반으로 하는 언어에서 f(x) = y이고 f(x) = z라고 해도 y z 같지 않을 있다. 함수 f에서 발생하는 부수 효과에 의해 결과값이 변경될 있기 때문이다. 반면에 부수 효과를 금지하는 언어에서는 f(x) = y이고 f(x) = z 항상 y z 동일하다. 전자를 명령형 언어(imperative language)라고 부르고 후자를 함수형 언어(functional language)라고 부른다. 현재 주류 언어의 위치를 차지하고 있는 Algol 계열의 언어들은 명령형 언어에 속하며 지금까지 우리가 책이나 학교에서 배웠던 프로그래밍 방식은 거의 대부분 부수 효과를 이용하는 명형형 프로그래밍 방식이라고 봐도 무관하다.

함수가
부수 효과를 가질 경우 참조 투명성(referential transparency) 만족할 없다. 참조 투명성이란 어떤 표현식 e 있을 , e 값을 바꾸지 않고 다른 표현식으로 대체할 있음을 의미한다. 참조 투명성을 만족시키는 함수 f 대해 f(x) = y이고 f(x) = z 경우 y z 항상 동일한 값을 가진다.

부수
효과는 프로그램의 버그를 발생시키는 온상이다. 따라서 부수 효과를 없애면 디버깅이 용이해 진다. 부수 효과를 제거하고 참조 투명성을 유지함으로써 프로그램의 수행 결과를 예측 가능한 상태로 유지할 있다. 부수 효과를 가진 프로그램은 함수 호출 순서에 따라 다른 결과를 얻게 되므로 프로그래밍 동안 함수 호출 순서에 주의를 기울여야 한다. 부수 효과의 존재 유무를 판단하기 위해서는 추상화 뿐만 아니라 구현 세부 사항까지 인지하고 있어야 한다. 이것은 프로그래가 짊어져야 개념적 무게를 증가시킨다.

Java
같은 명령형 언어를 사용하는 경우 부수 효과를 피할 수는 없다. 따라서 부수 효과를 완벽하게 제거할 없다면 부수 효과를 명시적으로 표현하는 방법을 찾아야 한다. Betrand Meyer 계약에 의한 설계(Design By Contract, 이하 DBC)라는 개념을 도입해서 부수 효과를 명시적으로 표현할 것을 제안했다. DBC에서 부수 효과는 사후 조건(precondition) 사용해서 표현되며 Meyer 논문에서 예를 들어 설명하고 있는 Eiffel 경우 언어 차원에서 사후 조건을 기술할 있도록 지원한다.

사후
조건은 상태 변화를 기반으로 부수 효과를 기술한다. 따라서 부수 효과의 유무를 파악하기 위해 코드 이곳 저곳을 파헤치거나 분기 구문을 따라 깊은 중첩 구조를 헤매다닐 필요가 없다. DBC 사후 조건을 사용하므로써 코드를 이해하기 쉽고 명확하게 만들 있다.

Java
같이 언어 차원에서 DBC 지원하지 못하는 경우에는 어떻게 해야 할까?

 

오퍼레이션의 사후조건과 클래스와 AGGREGATE 불변식을 명시하라. 프로그래밍 언어를 사용해서 프로그램 코드 안에 직접 ASSERTION 명시할 없다면 자동화된 단위 테스트를 작성해서 ASSERTION 내용을 표현하라. 프로젝트에서 사용하고 있는 개발 프로세스의 형식에 맞는 적절한 문서나 다이어그램으로 ASSERTION 서술하라.

- Eric Evan, Domain-Driven Design

 

ChangeBooth addExhcnageRate() 메소드는 부수 효과를 포함한다. 환율의 추가는 이후의 환전 로직에 어떤 방식으로든 영향을 미친다. 통화 쌍의 환율을 추가하면 관계를 가진 통화 쌍에 대해서도 환율을 계산할 있다. 이런 사실을 어디에 기록해야 할까? 테스트 케이스가 최적의 장소다.