계약에 의한 설계
IT 위키
Design by Contract; DbC; 협약에 의한 설계
컴포넌트를 호출하는 쪽과 제공하는 쪽이 지켜야 할 의무를 명세로 못박아 두는 설계 방법
버트란드 마이어(Bertrand Meyer)가 Eiffel 언어를 만들며 제시했다. 상거래 계약처럼 "네가 이 조건을 지키면, 나는 이 결과를 보장한다" 는 형태로 인터페이스를 규정한다.
| 조건 | 영문 | 누가 지키나 | 내용 |
|---|---|---|---|
| 선행 조건 | Precondition | 호출하는 쪽 | 오퍼레이션을 호출하기 전에 참이어야 하는 조건 |
| 결과 조건 | Postcondition | 제공하는 쪽 | 오퍼레이션이 끝난 후에 만족되어야 하는 조건 |
| 불변 조건 | Invariant | 양쪽 | 오퍼레이션이 실행되는 동안 항상 만족되어야 하는 조건 |
계좌에서 돈을 빼는 오퍼레이션이라면 다음과 같다.
- 선행 조건 : 출금액이 0보다 크고 잔액 이하여야 한다.
- 결과 조건 : 실행 후 잔액 = 실행 전 잔액 - 출금액
- 불변 조건 : 잔액은 언제나 0 이상이다.
선행 조건을 어긴 것은 호출한 쪽의 잘못이고, 결과 조건을 못 지킨 것은 제공한 쪽의 잘못이다. 책임 소재가 명세만으로 갈린다.
- 인터페이스 명세가 구체적이어서 컴포넌트를 재사용할 때 오해가 줄어든다.
- 조건을 그대로 단정문(assertion)으로 옮기면 실행 중에 위반을 잡아낼 수 있다.
- 조건이 곧 테스트 케이스가 되어 소프트웨어 테스트 설계가 쉬워진다.
- 방어 코드를 양쪽에서 중복으로 넣는 일을 줄인다.
