Topic 23 계약에 의한 설계
데이비드 토머스, 앤드류 헌트
느낌표 ! (인상 깊은 문장 | 문맥)
버트런드 마이어(Bertrand Meyer)는 에펠(Eiffel)이라는 언어를 만들면서 ‘계약에 의한 설게(Design By Contract, DBC)’개념을 개발했다. DBC 는 단순하지만 강력한 기법으로, 프로그램의 정확성을 보장하기 위해 소프트웨어 모듈의 권리와 책임을 문서화하고 합의하는 데에 초점을 맞춘다. 정확한 프로그램이란 무엇인가? 자신이 하는 일이라고 주장하는 것보다 많지도 적지도 않게 딱 그만큼만 하는 프로그램이다. 이 주장을 문서화하고 검증하는 것이 ‘계약에 의한 설계’의 핵심이다.
p.142-143
함수는 x 를 입력했을 때 y 의 결과값을 반환하는 것처럼 우리의 프로그래밍도 함수들로 구성되어있다. 생각해보면 예상되는 입력 값에 대한 생각은 하지만 예게치 못한 생각은 비교적 적게한다. 그렇지만 계약에 의한 설계처럼 정확한 동작을 명세하는 것도 중요하겠다는 생각이 든다.
accept-deposit 을 0보다 큰 입금 금액과 유효한 계좌를 인자로 호출하면 적절한 유형의 거래를 생성하고 필요한 처리를 수행할 것이다. 하지만 프로그램에 버그가 있어서 어쩌다가 입금 금액으로 음수를 넘기면 런타임 예외가 발생할 것이다.
p.150
저자가 예시로 든 부분은 어쩌면 당연하게 생각될 수 있는 부분이지만 쉬운 예를 위해 든 것 같다. 필자의 경우는 정말 만약의 경우에만 위와 같은 조건문을 추가하는데 올바르고, 올바르지 않는 입력 값에 대해 깊은 고민을 하지 않는다. 그렇지만 인용구를 읽고 몇몇 군데 적용할만한 곳이 생각난다.
코드를 작성하기 전에 유효한 입력 범위가 무엇인지, 경계 조건이 무엇인지, 루틴이 뭘 전달한다고 약속하는지, 혹은 더 중요하게는 무엇을 약속하지 않는지 등을 나열하는 것만으로도 더 나은 소프트웨어를 작성하는 데에 엄청난 도움이 된다.
p.153
이런 가정들을 문서화하는 것은 꽤 훌륭한 출발이 되겠지만, 컴파일러가 여러분 대신 계약을 검사하도록 한다면 훨씬 더 큰 도움이 될 것이다.
p.153
버그를 줄이고 버그를 조기 발견을 위해서는 입력 값에 대한 정보를 정확히 파악하는 것이 중요하다. 때로는 명세가 이해가 되지 않을 때가 있는데 이럴 때는 구체적으로 파고 들어 입력 가능한 범위, 값 전달 등을 볼 때 오히려 이해가 쉽다. 저자는 여기서 더 나아가 코드를 계약적으로 접근해야한다고 설명하고 있는데 매력적인 설명이다.
Topic 23 느낌
Topic 23 에서는 코드는 명확히 동작해야하기 때문에 계약적으로 접근해야한다고 설명하고 있다.