오늘부터 공부한다
결합도(Coupling)과 응집도(Cohesion) 본문
결합도와 응집도는 모듈의 독립성을 판단하는 두 가지 지표이다.
결합도(또는 의존도)는 어떤 모듈이 다른 모듈에 의존 정도를 말한다.
응집도는 모듈 내부의 기능적인 집중 정도라고 할 수 있다.
이상적인 모듈화는 결합도는 낮을 수록, 응집도는 높을 수록 "유지보수성이 높다"라고 할 수 있다.
결합도가 높은 클래스의 문제점
- 연관된 다른 클래스가 변경되면 더불어 변경이 필요하다
- 수정하려는 클래스를 이해하기 위해 연관된 클래스를 함께 이해해야한다.
- 다른 프로그램에서의 클래스를 재사용하기 힘들다.
응집도가 낮은 클래스의 문제점
- 이해하기 어려움
- 재사용하기 힘듦
- 유지보수가 어려움
- 다른 클래스의 변화에 민감함
결합도(Coupling)
위에서 설명했듯이
소프트웨어 공학에서의 결합도는 모듈과 모듈간의 상호 의존을 말한다.
응집도(Cohesion)와 반대되는 개념이다.
결합도는 약해질 수도 있고 강해질 수도 있다.
강한 것 부터 약한 것 순으로 나열하면 다음과 같다.
결합도 순서 : 내용(강) -> 공통 -> 외부 -> 제어 -> 스탬프 -> 데이터(자료) 결합도(약)
Procedural Programming
Content Coupling (내용 결합도)
하나의 모듈이 다른 모듈의 내부 동작을 수정하거나 내부 동작에 의존하는 상태.
(내부 자료나 제어 정보를 사용하는 것이다.)
한 모듈이 데이터를 생성하는 방법을 변경하면, 다른 모듈의 변경이 필요하다.
(다른 모듈이 로컬 데이터에 접근하는 경우)
Common Coupling (공통 결합도)
두 개의 모듈이 같은 글로벌 데이터를 공유하는 상태. (전역 변수)
공유 자원(변수)을 변경하면 그 자원을 사용하는 모든 모듈의 변경이 필요하다.
External Coupling (외부 결합도)
두 개의 모듈이 외부에서 도입된 데이터 포맷, 통신 프로토콜, 디바이스 인터페이스를 공유할 때 발생.
(SW 외부환경과 연관되어 있음)
기본적으로 외부 툴이나 디바이스와의 통신과 관련이 있다.
Control Coupling (제어 결합도)
하나의 모듈이 다른 모듈로 무엇을 해야 하는지에 대한 정보를 넘겨줌으로써 다른 모듈의 흐름을 제어
Stamp Coupling (data-structured coupling) (스탬프 결합도)
모듈들이 데이터 구조를 공유하고, 그 서로 다른 일부만을 사용하는 경우
접근할 필요가 없는 필드만 수정되는 경우에도, 레코드/필드를 읽는 방법을 변경해야 한다.
(데이터의 배치가 변경되기 때문)
Data Coupling (자료 결합도)
모듈들이 parameter 등을 통해 데이터를 공유하는 경우
각 데이터가 기본적인 것(elementary piece)이고, 그 데이터를 공유하는 유일한 데이터이어야 한다.
(제곱근을 계산하는 함수로 하나의 정수를 전달하는 경우)
Message Coupling (메시지 결합도)
가장 낮은 결합도 단계. 분산 및 메시지 전달로 실현 (decentralization & message passing)
(의존성 주입 / dependency injection, Observable)
Object-Oriented Programming
Subclass coupling (서브클래스 결합)
부모 클래스와 자녀 클래스의 관계에서 발생하는 경우. 자녀 클래스만 부모 클래스에 연결되는 단방향 관계
낮은 결합도의 형태
Temporal Coupling (일시적 결합)
두 개의 프로세스가 동시에 발생해서 하나의 모듈에 묶이는 경우
응집도 (Cohesion)
프로그램의 한 요소가 해당하는 기능을 수행하기 위해 얼마만큼의 연관된 책임이 뭉쳐있는지를 나타내는 정도.
일반적인 프로그램의 한 요소가 목적을 이루기 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고,
지나치게 많은 일을 하지 않으면 그것을 "응집도가 높다"라고 말한다.
결합도 순서 : 기능적 응집도(강) -> 순차적 -> 통신/교환적 -> 절차적 -> 시간적 -> 논리적 -> 우연적(약)
Functional Cohesion (기능적 응집도)
모듈 내부의 기능들이 단일 목적을 수행하기 위해 grouping 되는 경우
(Lexcial analysis of an XML String)
Sequential Cohesion (순차적 응집도)
모듈의 한 활동으로부터 나온 출력 값을 다른 활동(다음 기능)에 사용한 경우
(파일에서 데이터를 읽고 처리하는 함수)
Communicational/informational Cohesion (교환적/통신적 응집도)
여러가지 기능을 수행하며 모듈 내부의 기능들이 같은 데이터를 처리(입/출력)할 때 grouping 되는 경우
(정보의 같은 레코드를 작동하는 모듈)
Procedural Cohesion (절차적 응집도)
모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행하는 경우
(파일 허가를 확인한 뒤 열어보는 함수)
Temporal Cohesion (시간적 응집도)
프로그램이 실행되어야 하는 특정 시간 내에 처리되어야 할 프로세스들을 한 모듈에서 처리할 경우
(열려 있는 파일을 닫는 예외 상황을 잡아내어 에러 로그를 생성하고 사용자에게 알려주는 함수)
Logical Cohesion (논리적 응집도)
유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
(키보드와 마우스를 입력 처리 루틴으로 그룹화)
Coincidental Cohesion (우연적 응집도)
모듈 내부의 각 구성요소들이 연관이 없거나 임의적인 경우.
모듈화의 장점이 없다.
유지보수 작업이 힘들어진다.
'소프트웨어 공학' 카테고리의 다른 글
얕은 복사 (shallow copy) vs 깊은 복사 (deep copy) (0) | 2019.11.11 |
---|---|
빅데이터(Big Data) (0) | 2019.10.17 |
시큐어 코딩(Secure Coding) (0) | 2019.10.16 |
QA와 QC (0) | 2019.10.16 |
디자인 패턴 (0) | 2019.10.15 |