소프트웨어의 모듈성과 복잡성 사이의 균형에 관한 서적
- 시스템: 무언가를 달성하기 위해 구성된 상호 연결된 요소들의 집합
- 공유된 결합의 원인(연쇄 변경의 원인)
- 수명 주기의 결합: 모놀리식 어플리케이션.
- 공유된 지식: 경계를 넘어 더 많은 지식을 공유
- 지식은 종속성의 반대 반향으로 흐른다. 즉, 사용하는 쪽이 지식을 공유 받는다
- 커네빈
- 복잡성에 대한 의사결정 지원 프레임워크
- 도메인 분류 ( 아래로 갈 수록 복잡 )
- 명확: 시스템에 대한 영향이 명확하고 예측 가능한 도메인
- 복합: 지식이 부족하다고 인식되는 도메인 → 전문가의 지원을 통해 해결
- 복잡: 전문가가 없는 도메인 → 반복적인 실험을 통해 해결
- 혼돈: 인과관계가 없고 전문가와 상의하거나 실험을 수행 할 수 없는 도메인 → 반사적 대응 필요
- 무질서: 위 4개의 도메인 중 어디에 속하는지 알 수 없는 도메인
- 결합과 복잡성
- 복잡성: 이해하기 어려워 변경에 더 많은 노력이 필요한 인지 부하
- 시스템 설계에서는 변경의 결과를 명확하고 명시적으로 만들어야 한다.
- 전역 복잡성: 시스템 구성 요소 간 상호작용의 복잡성
- 지역 복잡성: 단일 구성 요소 내부 상호작용의 복잡성
- 자유도: 다른 변수에 제약받지 않고 값을 변경 할 수 있는 독립 변수의 수
- 높을 수록 복잡해 지며 제약 조건을 많을 수록 명확해 진다
- 결합과 모듈성
- 모듈성: 컴파일 할 수 있는 독립적 단위로 추출될 가능성이 있는 기능
- 속성
- 기능: 모듈의 목표. 공개 인터페이스를 통해 노출되는 기능
- 로직: 모듈의 동작 방식. 다른 모듈로부터 숨겨져야 하는 기능
- 맥락(context): 모듈을 사용해야 하는 환경 ( 요구사항, 암묵적 가정 등등 )
- 모듈식 설계는 필수적인 상호 관계를 관리하면서 우연적 결합은 제거해야 한다 → 시스템 구성요소의 관계를 단순화하는것이 목표
- 추상화를 이용하되 대상을 모호하게 만들어서는 안된다
- 구조적 설계 결합
- 모듈 간 관계의 강도
- 인터페이스의 유형을 보여주는데 적합하다
- 가용한 가장 유용한 결합 방식을 선택해야 한다 → 모듈식 설계가 중요한 것이지 결합 강도를 낮추는게 목표가 아니다
- 결합도: 콘텐츠 → 공통 → 외부 → 제어 → 스탬프 → 데이터
- 콘텐츠 결합
- 하위 모듈이 공개 인터페이스 대신 상위 모듈의 지식을 직접 참조하는 경우 → 비공개 메서드 직접 접근
- 다른 모듈의 인프라 구성 요소에 직접 접근하는 경우
- 공통 결합
- 전역적으로 공유되는 데이터 구조를 사용하는 경우
- 콘텐츠 결합과 다르게 의도된 공유
- 외부 결합
- 전역적으로 공유되는 데이터 구조를 사용하지만 공통 결합과 달리 통합에 실제로 필요한 데이터만 공유된 경우
- 제어 결합
- 한 모듈이 다른 모듈의 내부 실행 흐름을 제어할 수 있는 정보를 전달하는 경우
- 상위 모듈이 로직을 캡슐화하지 못했다는 신호
- 실행 결정을 독립적으로 내리지 못하면 발생
- 스탬프 결합
- 구현 세부 정보 중 일부를 공개하는 데이터 구조를 전달하여 통신하는 경우
- 경계를 가로질러 비즈니스 로직이 공유되지 않아야 한다
- 데이터 결합
- 비즈니스 로직을 공유하지 않고 경계를 넘는 데이터의 구조가 최소화된 경우
- 내부 데이터 구조를 DTO로 변경하여 전달하는 경우
- 공생성
- 두 모듈의 수명주기가 얽혀 있음을 나타낸다
- 인터페이스의 복잡성을 반영한다
- 정적 공생성: 모듈 경계를 넘어 전달될 수 있는 지식 유형 ( 아래로 갈 수록 더 강한 공생성을 지닌다)
- 이름 공생성: 연결된 모듈이 같은 이름을 써야하는 공생성
- 유형 공생성: 연결된 모듈이 같은 타입을 써야하는 공생성
- 의미 공생성: 특정값에 특별한 의미를 부여하는 경우 발생하는 공생성 → magic value
- 알고리즘 공생성: 인터페이스를 통해 전송되는 값을 이해하기 위해 특정 알고리즘을 사용하는 경우 발생하는 공생성
- 위치 공생성: 요소(array)가 특정한 순서로 있어야 하는 것에 동의한 경우 발생하는 공생성
- 동적 공생성
- 실행 공생성: 모듈들을 특정 순서에 따라 실행해야 할 때 발생하는 공생성 → ex) jdbc
- 타이밍 공생성: 특정 순서에 따라 실행되고 모듈 사이에 시간 간격이 필요한 공생성 → ex) 이벤트 발행
- 값 공생성: 동시에 변경되어야 하는 값이 존재할 때 발생하는 공생성
- 동일 공생성: 두 객체가 올바르게 동작하기 위해 참조하는 3번째 객체가 서로 동일해야 하는 경우 발생하는 공생성
- 통합 강도
- 구조적 설계 결합과 공생성을 통합한 결합 척도
- 종류(아래로 갈 수록 더 약한 결합)
- 침입 결합
- 공개 인터페이스 대신 구현 세부 사항을 통해 통신하는 결합
- 상위 모듈이 고려하지 않는 방식으로 하위 모듈이 구현되는 경우 발생한다
- 콘텐츠 결합과 동일하다
- 기능 결합
- 구현하는 기능에 대한 지식을 공유하는 결합
- 공통, 외부, 제어 결합과 유사하다
- 순차적 기능: 여러 작업을 특정 순서로 호출해야 할 때 발생. 실행, 타이밍 공생성이 포함됨
- 트랜잭션 기능: 동시성을 관리해야 할 때 발생. 값, 동일 공생성이 포함된다
- 대칭적 기능: 구현 방법에 관계없이 동일한 기능을 구현하는 경우
- 모델 결합
- 동일한 비즈니스 도메인의 데이터 모델이 여러 모듈에서 사용되는 결합
- 스탬프 결합과 유사하다
- 계약 결합
- 통합 특화 모델인 계약을 통해 통신하는 경우 발생하는 결합
- 캡슐화하지 않는 특화 모델은 오히려 시스템을 더 복잡하게 만든다
- 데이터 결합과 유사하다
- 거리(공간)
- 변동성
- 결합 균형
- 결합 재조정
- 결론