[SW공학] 결합도(Coupling)와 응집도(Cohesion)

joyful·2021년 8월 17일
0

CS

목록 보기
8/14

1. 모듈화

1.1 개요

  • 모듈화(Modularization)

    • 소프트웨어를 각 기능별로 나누는 것
    • 프로그램이 효율적으로 관리될 수 있도록 시스템을 분해하고 추상화함으로써 소프트웨어 제품의 성능을 향상시키거나 시스템의 수정 및 재사용, 유지 관리를 용이하게 하는 기법
  • 모듈(Module)

    • 기능별로 나눠진 모듈화의 결과
    • 소프트웨어 내의 프로그램 또는 작업 단위
      → 일종의 "서브루틴(subroutine)"

1.2 독립성

  • 모듈은 주어진 기능만을 독립적으로 수행하며 다른 모듈과 적게 연관되어야 함
  • 모듈의 결합도(Coupling)응집도(Cohesion)으로 측정
  • 독립성이 높을 수록 좋은 모듈
    → 해당 모듈을 수정 시 다른 모듈에 미치는 영향 감소하므로

💡 이상적인 모듈화

결합도는 약하게, 응집도는 강하게, 모듈의 크기는 작게


1.3 고려사항

  • 모듈의 크기가 너무 작은 경우
    → 모듈 개수가 많아져서 모듈 간의 통합 비용이 많이 듦
  • 모듈의 크기가 너무 큰 경우
    → 모듈 간의 통합 비용은 상대적으로 감소하는 대신 모듈 하나를 개발하는 데 드는 비용이 커짐


2. 결합도(Coupling)

서로 다른 모듈 간 상호 의존하는 정도 또는 두 모듈 사이의 연관된 관계

구분설명
자료 결합도
(Data Coupling)
◾ 모듈 간의 인터페이스로 전달되는 파라미터를 통해서만 모듈 간의
   상호작용이 일어나는 경우
순수한 자료형 요소
스탬프 결합도
(Stamp Coupling)
◾ 모듈 간의 인터페이스로 배열이나 오브젝트, 스트럭처 등이 전달되는 경우
◾ 자료 구조의 형태 변경 시 참조하고 있는 모든 모듈에 영향 미침
◾ 변경되는 필드를 실제로 참조하지 않는 모듈에도 영향 미침
제어 결합도
(Control Coupling)
단순 처리할 대상인 값만 전달되는 게 아니라 어떻게 처리를 해야 한다는
제어 요소가 전달되는 경우
ex) 파라미터로 전달되는 값에 따라 모듈 내부 로직이 처리가 달라지는
     Flag 값 등으로 결합
외부 결합도
(External Coupling)
◾ 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성들이 그 기능을
   순차적으로 수행할 경우
◾ 특수한 외부환경에 종속 또는 연관되어있는 경우
   ex) 외부의 데이터, 통신 프로토콜 등을 공유할 때
◾ 참조되는 데이터의 범위가 각 모듈에서 제한
공통 결합도
(Common Coupling)
파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 갱신하는
식으로 상호작용하는 경우
내용 결합도
(Content Coupling)
다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우

💡 참고

  • 변경될 가능성이 적은 모듈의 경우, 결합도가 높아도 문제가 되지 않을 수 있음
    ex1) 표준 라이브러리에 포함된 모듈
    ex2) 성숙 단계에 접어든 모듈에 의존하는 경우
  • 그러나 모듈간 변화의 영향과 의존성을 낮추고 재사용성을 높이기 위해 결합도를 낮게 유지시키는 것이 좋음


3. 응집도(Cohesion)

모듈 내부에서 구성 요소 간에 밀접한 관계를 맺고 있는 정도

구분설명
기능적 응집도
(Functional Cohesion)
모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우
ex) 코사인(cosine)과 같은 삼각함수를 계산하는 기능을 모아둔 함수
순차적 응집도
(Sequential Cohesion)
모듈 내에서 한 활동으로부터 나온 출력값다른 활동에 사용할 경우
ex) 어떤 모듈이 특정 파일을 읽어와 처리하는 기능
통신적 응집도
(Communication Cohesion)
동일입력출력을 사용하여 다른 기능을 수행하는 활동들이
모여 있는 경우
절차적 응집도
(Procedural Cohesion)
모듈이 다수의 관련 기능을 가질 때, 모듈 안의 구성 요소들이 그 기능을
순차적으로 수행하는 경우
ex) 파일을 읽을 때 접근 허가를 확인한 후 파일을 읽음
시간적 응집도
(Temporal Cohesion)
연관된 기능이라기보다는 특정 시점에 처리되어야 하는 활동들을
한 모듈에서 처리하는 경우
ex1) 프로그램 구동 시 초기화 시키는 모듈
ex2) 예외 상황 발생 시 오류 로그를 개발자에게 전송
논리적 응집도
(Logical Cohesion)
유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이
한 모듈에서 처리되는 경우
우연적 응집도
(Coincidental Cohesion)
모듈 내부의 각 구성 요소들이 연관이 없는 경우

💡 주의

응집도가 높을 수록 복잡도가 감소하나, 다음과 같은 이슈가 발생할 수 있음

  • 서로 다른 코드를 하나의 모듈에 몰아 넣고, 그 중 하나의 코드를 변경해야 하는 경우
    → 모듈 내 변경할 필요가 없는 코드까지 수정해야 할 수 있음
  • 하나의 모듈에 수정해야 할 코드가 모여있지 않고 엉뚱한 곳에 코드가 모여있는 경우
    → 여러 가지가 얽혀있게되므로 코드 수정이 어려워짐


4. 복잡도

팬인/팬아웃을 분석하여 프로그램의 복잡도를 조절할 수 있음

✅ 팬인(Fan In)

자신을 사용하는 타 모듈의 수

  • 높은 경우, 해당 클래스를 사용하는 클래스의 수가 많음을 의미
  • 공통 모듈화 측면에서 잘 설계되어 있으나 단일 실패점 발생 가능
    → 중점 관리 및 더 많은 테스트를 통한 검증 필요

✅ 팬아웃(Fan Out)

자신이 호출하는 타 모듈의 수

  • 높은 경우, 하나의 클래스가 많은 수의 다른 클래스를 사용함을 의미
    • 불필요한 기능을 호출하고 있지 않은지 추가 검토
    • 업무 로직을 단순화시킬 수 있는지 검토

✅ 예시

모듈팬인갯수팬아웃갯수
A없음0B, C, D3
BA1E, H2
CA1F, G, J3
DA1J1
EB1H1
FC1없음0
GC1I1
HB, E2없음0
IG, J2없음0
JC, D2I1



📖 참고

profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글