코드의 유지보수는 매우 중요하다. 아무래도 미래에 나에게 적은 노동 시간을 줄 수도 있고, 함께 일하는 팀원들에게도 예쁨받을 수 있다. 이러한 점에서 역시 중요한 것은 코드의 품질이다. OOP를 공부하는 이유가 역시 그것 아닐까. 그 중 정말 중요한 개념인 결합도, 응집도에 대해서 이해해보는 시간을 가지려 한다.
결합도 (Coupling)
- Coupling
- 커플링이 심해진 코드를 스파게티 코드라 함
- 살펴봐야 할 것들
- 왜 결합도가 높아졌는가?
- 어떻게하면 그 결합도를 낮출 수 있는가?
- 종류 (강한순서로)
- 내용결합도
- 하나의 모듈이 다른 모듈의 내부 동작을 수정하거나 의존하는 상태
- 다른 모듈의 로컬 데이터의 접근하는 경우
- A 모듈의 데이터 생성 방법을 변경하면 B 모듈의 변경이 필요
- 공통결합도
- 두 개의 모듈이 같은 전역 변수를 공유하는 상태
- 외부결합도
- 두 개의 모듈이 외부에서 도입된 데이터 포맷, 통신 프로토콜, 디바이스 인터페이스를 공유하는 상태
- 외부 툴이나 디바이스 통신과 관련이 있음
- 제어결합도
- 하나의 모듈이 다른 모듈로 정보를 넘겨 흐름을 제어하는 경우를 말함
- 스탬프결합도
- 복합 데이터 구조(Array, Dictionary)를 공유하고, 그 일부만 사용
- 자료결합도
- 모듈들이 자료요소 성격의 파라미터를 통해 데이터를 공유하는 경우
- 메시지결합도
응집도 (Cohesion)
- Cohesion
- 결합도와 반대되는 개념
- 종류 (강한 순서로)
- 기능적응집도
- 모듈 내부의 모든 기능이 단일 목적 수행
- 모든 경우가 이렇다면 가장 이상적
- 순차적응집도
- 모듈내에서의 결과를 다른 활동에서 사용하는 경우
- 교환적응집도
- 입력과 출력이 동일하나 다른 기능을 수행하는 활동들을 모음
- 좋지 않나라고 생각할 수 있으나, 단순히 입출력만 같기 때문에 애매함
- 절차적응집도
- 다수의 관련 기능을 가질 때, 모듈 구성 요소들이 그 기능을 순차적으로 수행
- 시간적응집도
- 특정 시간에 처리되어야 할 활동들을 한 모듈에서 처리
ViewDidLoad
- 논리적응집도
- 유사한 성격을 갖거나 특정 형태로 분류되는 처리요소를 한 모듈에서 처리
- 실제로는 다른 것이지만 성격이 비슷하여 묶음
- 우연적응집도
- 응집도가 높고, 결합도가 낮은 클래스
- 인스턴스 변수의 수가 적어야 함
- 각 메소드는 인스턴스 변수를 하나 이상 사용해야 함
- 메소드가 인스턴스 변수를 더 많이 사용할 수록 응집도가 높음
self
를 사용함으로써 멤버변수를 사용하고 있는지 주기적인 체크가 가능
- 응집도 높고, 결합도가 낮으면 좋을까?
- 응집도가 지나치게 매우 높은 경우
- 사실상 불가능
- 코드 생산에 너무 많은 비용 소모
- 유사한 비용인 경우 응집도가 높은 것이 좋음
- 유사한 비용으로 응집도 높은 코드를 짤 수 있다는 것은 코딩을 잘한다는 말
- 많이 연습해서 이러한 레벨로 성장해야함