Coupling & Cohesion

최완식·2022년 2월 1일
0
post-thumbnail

코드의 유지보수는 매우 중요하다. 아무래도 미래에 나에게 적은 노동 시간을 줄 수도 있고, 함께 일하는 팀원들에게도 예쁨받을 수 있다. 이러한 점에서 역시 중요한 것은 코드의 품질이다. OOP를 공부하는 이유가 역시 그것 아닐까. 그 중 정말 중요한 개념인 결합도, 응집도에 대해서 이해해보는 시간을 가지려 한다.

결합도 (Coupling)

  • Coupling
  • 커플링이 심해진 코드를 스파게티 코드라 함
  • 살펴봐야 할 것들
    • 왜 결합도가 높아졌는가?
    • 어떻게하면 그 결합도를 낮출 수 있는가?
  • 종류 (강한순서로)
    • 내용결합도
      • 하나의 모듈이 다른 모듈의 내부 동작을 수정하거나 의존하는 상태
      • 다른 모듈의 로컬 데이터의 접근하는 경우
      • A 모듈의 데이터 생성 방법을 변경하면 B 모듈의 변경이 필요
    • 공통결합도
      • 두 개의 모듈이 같은 전역 변수를 공유하는 상태
    • 외부결합도
      • 두 개의 모듈이 외부에서 도입된 데이터 포맷, 통신 프로토콜, 디바이스 인터페이스를 공유하는 상태
      • 외부 툴이나 디바이스 통신과 관련이 있음
    • 제어결합도
      • 하나의 모듈이 다른 모듈로 정보를 넘겨 흐름을 제어하는 경우를 말함
    • 스탬프결합도
      • 복합 데이터 구조(Array, Dictionary)를 공유하고, 그 일부만 사용
    • 자료결합도
      • 모듈들이 자료요소 성격의 파라미터를 통해 데이터를 공유하는 경우
    • 메시지결합도
      • 메시지 패싱을 통해 이루어짐

응집도 (Cohesion)

  • Cohesion
  • 결합도와 반대되는 개념
  • 종류 (강한 순서로)
    • 기능적응집도
      • 모듈 내부의 모든 기능이 단일 목적 수행
      • 모든 경우가 이렇다면 가장 이상적
    • 순차적응집도
      • 모듈내에서의 결과를 다른 활동에서 사용하는 경우
    • 교환적응집도
      • 입력과 출력이 동일하나 다른 기능을 수행하는 활동들을 모음
      • 좋지 않나라고 생각할 수 있으나, 단순히 입출력만 같기 때문에 애매함
    • 절차적응집도
      • 다수의 관련 기능을 가질 때, 모듈 구성 요소들이 그 기능을 순차적으로 수행
    • 시간적응집도
      • 특정 시간에 처리되어야 할 활동들을 한 모듈에서 처리
      • ViewDidLoad
    • 논리적응집도
      • 유사한 성격을 갖거나 특정 형태로 분류되는 처리요소를 한 모듈에서 처리
      • 실제로는 다른 것이지만 성격이 비슷하여 묶음
    • 우연적응집도
      • 아무 상관없는 경우
  • 응집도가 높고, 결합도가 낮은 클래스
    • 인스턴스 변수의 수가 적어야 함
    • 각 메소드는 인스턴스 변수를 하나 이상 사용해야 함
    • 메소드가 인스턴스 변수를 더 많이 사용할 수록 응집도가 높음
    • self를 사용함으로써 멤버변수를 사용하고 있는지 주기적인 체크가 가능
      • 컴파일러의 성능을 높혀주는 효과도 있음
  • 응집도 높고, 결합도가 낮으면 좋을까?
    • 응집도가 지나치게 매우 높은 경우
      • 사실상 불가능
      • 코드 생산에 너무 많은 비용 소모
      • 유사한 비용인 경우 응집도가 높은 것이 좋음
        • 유사한 비용으로 응집도 높은 코드를 짤 수 있다는 것은 코딩을 잘한다는 말
        • 많이 연습해서 이러한 레벨로 성장해야함
profile
Goal, Plan, Execute.

0개의 댓글