소프트웨어공학
설계(Part 7) : 모듈화
chlqhrud0208
2024. 12. 15. 16:46
- 7가지 바람직한 설계 목표
- 느슨한 결합 (모듈끼리의 결합)
- 강한 응집력
- 복잡성 최소
- 유연성
- 확장성
- 유지보수성
- 재사용성
- 모듈화
- 모듈(Module) : 시스템의 각 기능
- 소프트웨어의 성능을 향상시키기 위해서 기능 단위로 분해한 것
- 모듈의 독립성은 1) 결합도를 약하게 2) 응집도를 강하게 3) 모듈의 크기가 작을 때 높아짐
1) 모듈끼리의 영향 최소화
2) 모듈 안에서의 기능은 최대한 같은 기능
3) 너무 크면 모듈안의 기능들이 달라질 수 밖에 없음 - 결합도의 종류
- 자료 결합도
-> 가장 낮은 결합도
-> 단순히 파라미터 등을 통해 데이터를 주고 받음
-> 한 모듈의 내용을 변경해도 다른 모듈에는 전혀 영향을 미치지 않음
- 스탬프 결합도
-> 두 모듈이 동일한 자료구조를 참조하는 형태
-> 배열 또는 오브젝트 등이 전달될 때 (자료에서 확장된 형태)
-> 자료 구조의 형태가 변경되면 그것을 참조하는 모듈에 영향을 준다.
- 제어 결합도
-> 제어요소가 전달되는 경우 (if문, switch문)
- 외부 결합도
-> 어떤 모듈에서 외부로 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도
-> 외부의 값이 바뀌면 관련된 모듈 모두를 바꿔야 함
- 공통 결합도
-> 여러 모듈이 하나의 데이터 영역을 참조하여 사용하는 결합도
-> 전역 변수가 예시 (전역 변수의 변경이 여러 모듈에 영향을 미침)
-> 공통 데이터의 영역의 내용을 변경하면 이를 사용하는 모든 모듈에 영향 (독립성을 약하게 만듦)
-> 외부 데이터 참조보다 더 안 좋음
- 내용 결합도
-> 가장 높은 결합도
-> 어떤 모듈이 사용하려는 다른 모듈의 내부 기능과 데이터를 직접 참조하는 경우
-> 예를들어 A와 B가 똑같은 기능을 함 (극단적 예시)
- 응집도의 종류 (7단계)
- 기능적 응집도
-> 응집도가 가장 높으며, 가장 높은 형태
-> 모듈 내의 모든 요소들이 하나의 기능을 수행, 밀접하게 관련
- 순차적 응집도
-> 모듈 내의 한 요소의 출력 값이 다른 요소의 입력으로 사용되는 형태
- 교환적 응집도
-> 모든 요소들이 동일한 입력 또는 출력 데이터를 사용하여 서로 다른 기능을 수행하는 경우
-> 처리 순서가 중요하지 않음
- 절차적 응집도
-> 모듈이 다수의 관련 기능을 가질 때, 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행하는 경우
-> 순차적으로 수행되나 큰 연관성은 없음
- 시간적 응집도
-> 연관된 기능이라기 보다는 특정 시점에 처리되어야 하는 활동들을 한 모듈에서 처리하는 경우
- 논리적 응집도
-> 유사한 성격을 갖고있어서 한 모듈에서 처리되는 경우
-> 본질적으로는 다름
- 우연적 응집도
-> 서로 관련 없는 다른 기능을 수행
-> 요소들 간 아무런 관계가 없음
- 결합도 장단점
- 결합도 낮을 때의 장점
-> 유지보수성, 모듈성, 확장성 향상
- 결합도 높을 때의 단점
-> 모듈화, 재사용성, 유연성 감소
-> 복잡성 증가
- 응집도 장단점
- 응집도가 높을 때의 장점
-> 가독성 및 이해성 향상, 신뢰성 향상, 오류 격리 개선
- 응집도가 낮을 때의 단점
-> 난해한 모듈 이해, 기능 저하, 코드 중복 증가
- 팬인 (Fan-in) / 팬아웃 (Fan-out)
- 팬인 : 나를 호출하는 모듈 수
- 팬아웃 : 내가 호출하는 모듈 수
-> 시스템의 복잡도 측정 가능
- 시스템 복잡도
- 팬인이 높을수록, 팬아웃이 낮을수록 시스템 복잡도가 최적화 된다.
- 팬인이 높으면 다른 모듈이 해당 모듈을 많이 사용한다는 증거 (재사용이 높음)
-> 단일 장애점 발생 가능 : 한 모듈이 동작하지 않았을 때 전체 시스템이 중단될 수 있음
-> 관리 비용 및 테스트 비용 증가
-> 해당 모듈을 많이 사용한다고 해서 결합도가 높은 것은 아님
- 팬아웃이 낮을수록 해당 모듈이 다른 모듈을 적게 사용한다는 증거 (재사용할 때 좋음)
-> 팬아웃이 높으면 불필요한 모듈 호출할 수 있음
- 설계 요령
- 최상위 모듈의 결합은 줄이고, 응집은 높이도록 노력 (같은 level에서)
- 바꾼 모듈과 관련있는 모듈을 그 모듈의 하위에 두도록 노력