29장. 커플링
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
에드 유든과 래리 콘스탄틴은 고전적인 텍스트인 ' 구조화된 디자인'의 집필을 준비하면서 프로그램이 왜 그렇게 비싼지 알아내기 위해 프로그램을 조사했습니다. 이들은 비싼 프로그램에는 모두 한 가지 공통점이 있다는 것을 발견했습니다. 한 요소를 변경하려면 다른 요소도 변경해야 한다는 것이죠. 저렴한 프로그램은 로컬라이즈된 변경이 필요한 경향이 있었습니다.
이 변경 감염 속성을 "커플링"이라고 부릅니다. 한 요소를 변경하면 다른 요소도 변경해야 하는 경우 두 요소는 특정 변경 사항과 관련하여 결합됩니다.
예를 들어, 호출 함수는 호출된 함수의 이름 변경과 관련하여 호출된 함수에 연결됩니다:
caller()
called()
called() // changing this name requires changing the call site(s) too
... // changing the formatting of the body requires no changes to call sites
여기서 두 번째 설명은 결합의 중요한 뉘앙스를 강조합니다. 단순히 두 요소가 결합되어 있다고 말할 수는 없습니다. 유용한 말을 하려면 어떤 변화와 관련하여 결합되었다고 말해야 합니다. 두 요소가 결코 일어나지 않는 변화와 관련하여 결합되어 있다면 그것은 우리가 관심을 가져야 할 방식으로 결합되어 있지 않습니다. 그 결합은 언덕 꼭대기에 있는 바위가 마을을 무너뜨리기 위해 굴러 내려오지 않는 것과 같습니다.
결합 분석은 단순히 프로그램의 소스 코드를 보는 것만으로는 할 수 없습니다. 두 요소가 결합되어 있는지 여부를 파악하려면 먼저 어떤 변경이 발생했거나 발생할 가능성이 있는지 알아야 합니다. (실험을 위해 커밋에서 어떤 파일 쌍이 함께 나타나는 경향이 있는지 살펴보세요. 이러한 파일은 결합된 파일입니다.)
커플링은 소프트웨어 비용을 결정합니다. 커플링은 매우 근본적인 개념이기 때문에 저는 가능한 한 다양한 방식으로 표현하고 시각화합니다. 수학적으로 정의하자면
coupled(E1, E2, Δ) ≡ ΔE1 ⇒ ΔE2
그림 29-1은 이를 이미지로 보여줍니다.
그림 29-1. 이름 변경과 관련하여 호출된 함수와 연결된 호출 함수
커플 링이 두 요소 사이에만 존재한다면 우리의 악몽을 괴롭히지 않을 것입니다. 대신 결합에는 두 가지 속성이 있어 결합을 중심에 끌어당깁니다:
- 1-N
-
하나의 요소는 변경과 관련하여 다른 요소와 얼마든지 결합할 수 있습니다.
- 캐스케이딩
-
한 요소에서 다른 요소로 변화가 파급되면 그 암시된 변화는 또 다른 변화를 촉발할 수 있으며, 그 자체로자체적인 변화를 촉발할 수 있습니다.
1-N 문제는 도구를 사용하면 어느 ...