한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.
- 일대다: 변경 하나가 여러 요소에 닿는다
- 연쇄: 바뀐 요소가 또 다른 변경을 부른다. "시스템이 복잡하다"는 말은 결국 변경이 예상치 못한 결과를 낳는다는 뜻이다
- 소스 코드만 봐서는 다 보이지 않는다. 실제로 어떤 변경들이 함께 일어났는지를 봐야 드러난다
콘스탄틴의 등가성
래리 콘스탄틴(Larry Constantine, 『Structured Design』)의 관찰을 켄트 벡이 정리한 식이다. 소프트웨어 비용은 변경 비용과 거의 같고, 변경 비용은 소수의 큰 변경이 지배하며, 큰 변경을 비싸게 만드는 것은 결합이다. 그러므로 비용(소프트웨어) ≈ 결합도.
결합을 줄일 때
- 결합이 생긴 이유는 중요하지 않다. 지금 결합 비용을 계속 낼지, 없애는 비용을 낼지 고를 뿐이다
- 한 종류의 변경에 대한 결합을 줄이면 다른 종류의 변경에 대한 결합이 늘기 쉽다. 모든 결합을 없애려 하지 않는다
- 바로 디커플링(Decoupling)하기 어렵다면 먼저 응집도를 높인다. 함께 바뀌는 것을 가까이 모으는 것만으로도 변경이 쉬워진다
구체적인 처방으로는 디미터 법칙, 의존성 역전 원칙, 함수·필드 옮기기이 있다. 시스템 사이 결합을 메시지 큐(Message Queue)로 느슨하게 만드는 이야기는 Kafka와 트랜잭셔널 아웃박스 패턴 쪽에 있다.
출처: 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)