4 관점 프로그래머가 보는 시각 - ChoDragon9/posts GitHub Wiki

뒤로가기

4. 관점: 프로그래머가 보는 시각

4.1 응집도(Cohesion)

응집도란 모듈에 포함된 기능의 순수함을 나타내는 척도로, 모듈의 강도를 측정하는 단위다. 단계가 높을수록 순수하고 강하며 좋은 모듈이다. 모듈 내 요소 간 관계의 친밀함에 주목해서 판정한다.

1단계: 암합적 강도

모듈 내 요소 간 특별한 관계가 인정되지 않는다. 예를 들면 모듈 내 중복된 명령의 패턴을 우연히 발견했다는 이유로 통합해서 하나의 모듈로 만든 경우다. 이때는 해당 모듈의 기능을 바르게 명명해서 정의할 수 없다.

2단계: 논리적 강도

어떤 기능을 추상적으로 파악해서 모은 것이다. 예를 들면 모든 입출력 조작을 모아서 모듈화하거나 여러 가지 데이터를 편집하기 위한 모듈을 작성한 경우다. 하지만 관련된 기능을 하나의 모듈로 모은 것은 프로그래머의 사고를 집중시키는 장점이 있다.

3단계: 시간적 강도

특정 시점에 연속해서 실행되는 여러 개의 기능을 하나의 모듈로 모은 것이다. 이때 기능 사이에 그다지 강한 관련성은 없다. 다만 특정 시점에 연속해서 실행될 뿐이다. 대표적인 사례가 초기 처리 모듈이다.

4단계: 순서적 강도

문제를 처리하기 위해 관계된 여러 개의 기능은 순서대로 실행된다. 커다란 기능의 일부 순서를 하나의 모듈로 만들었다면 순서적 강도이다.

5단계: 연락적 강도

연락적 강도 모듈은 기본적으로 순서적 강도의 특성을 갖는다. 순서적 강도와의 차이점은 모듈 내 기능 사이에서 데이터를 교환하거나 같은 데이터를 참조한다는 것이다.

6단계: 정보적 강도

특정 자료구조를 다루는 여러 개의 기능을 하나의 모듈로 모은 것이다. 같은 자료구조(정보)는 가능한 한 특정 모듈에서만 접근하도록 하겠다는 발상이다. 논리적 강도 모듈 역시 정보 은닉의 특징을 갖고 있지만, 정보적 강도 모듈과의 차이점은 진입점의 개수다. 논리적 강도 모듈은 진입점을 하나만 가지며 실행할 기능은 파라미터에 의해 선택된다. 반면에 정보적 강도 모듈은 진입점을 여러 개 가지며 각 진입점은 단일한 고유 기능을 실행한다.

7단계: 기능적 강도

모듈 내의 모든 명령이 하나의 역할(기능)을 실행하기 위해 서로 관련된 모듈로, 응집도가 가장 높은 모듈이다. 단일 기능을 수행하기 위해 모든 명령이 서로 관련된다.

4.2 결합도(Coupling)

결합도란 모듈끼리 갖는 관계의 밀접함을 나타내는 척도로, 어떤 결합의 굵기를 측정하는 단위다. 단계가 높을수록 관계가 약하고 느슨한 결합이며 좋은 모듈이라고 할 수 있다. 모듈 간에 데이터를 얼마나 교환하는지에 주목해서 판정한다.

1단계: 내용 결합

한 모둘과 다른 모듈이 일부를 공유하는 모듈 결합 방식이다. 다른 모듈 내의 외부에 선언되지 않는 데이터를 직접 참조하거나 명령의 일부를 공유하는 경우가 여기에 해당한다.

2단계: 공통 결합

공통 영역에 정의된 데이터를 몇 개 모듈이 공동으로 사용하는 모듈 결합 방식이다. 공통 영역에 정의된 데이터란 이른바 전역 변수를 말한다.

공통 결합은 결합도가 높고 단점이 많다.

  • 인터페이스상에 나타나지 않으므로 코드 해독이 매우 어렵게 만든다.
  • 관계가 없는 모듈에서 사용 가능하므로 코드의 안전성이 낮아진다.
  • 여러 모듈과 이어져 있으므로 재사용성이 저해된다.

3단계: 외부 결합

외부 결합이란 외부에 선언된 데이터를 공유하는 모듈 결합 방식이다. 외부에 선언된 데이터란 예를 들면 public으로 선언된 변수를 말한다. 공통 결합과 비숫한데, 필요한 데이터만 외부에서 선언하기 때문에 비교적 결합도가 약하다.

4단계: 제어 결합

제어 결합이랑 호출하는 모듈 쪽에서 호출받는 모듈의 제어를 지시하는 데이터를 파라미터로 넘겨주는 모듈 결합 방식이다. 호출하는 쪽에서 호출받는 모듈의 논리를 알 필요가 있으므로 블랙박스처럼 다룰 수 없어 결합도가 강해진다.

5단계: 스탬프 결합

스탬프 결합이란 공통 영역에 없는 자료구조(정보)를 2개의 모듈에서 교환하는 모듈 결합 방식이다. 자료구조의 교환은 파라미터를 매개로 수행한다. 불필요한 데이터까지 교환된다는 점이 결합도를 조금 강하게 만든다.

6단계: 데이터 결합

데이터 결합이란 모듈 간의 인터페이스로 스칼라형 데이터 요소만들 파라미터로 교환하는 모듈 결합 방식이다. 상대 모듈을 블랙박스화할 수 있으므로 결합도는 가장 약하다. 스탬프 결합은 넘겨주는 자료구조(정보) 중에 일부 데이터만을 사용한다. 반대로 자료구조의 모든 데이터를 처리한다면 이는 데이터 결합이라고 간주해도 무방하다.

멱등성과 안전성

모듈이나 함수가 갖는 성질 중에 멱등성과 안전성이라는 개념이 있다.

멱등성이란 '어떤 조작을 반복해서 수행해도 결과가 같은 것'을 의미하는 수학 용어다. 안전성이란 '조작 대상의 상태를 변화시키지 않는 것'을 의미한다.

4.3 직교성

직교는 기하학에서 그래프의 좌표축과 같이 직각으로 교차하는 2개의 선분이 갖는 성질이다. 어떤 점을 X축에 평행하게 움직여 갔을 때 X값은 변화하지만 Y값은 변화하지 않는 다. 즉, X의 변경은 Y에 아무런 영향을 미치지 않는 다. 코드는 이처럼 직교성을 충족해야 한다.

2개 이상의 코드 덩어리가 있으면서 한쪽을 변경해도 다른 쪽에 영향을 주지 않는 다면 해당 코드는 직교하고 있다.

4.4 가역성

가역이란 어떤 변화가 발생해도 특정 조건을 가하면 원래 상태로 돌아오는 성질이다. 프로그래밍에서 내리는 판단은 항상 가역성을 갖도록 한다. 원래대로 돌아올 수 없는 결정을 내려서는 안된다.

실세계의 상황은 항상 변화하므로 실세계의 영향을 받는 소프트웨어 입장에서는 유연하고 적응력이 있는 가역적인 코드를 작성해 두어야 한다. 특정 기술에 종속되지 말고 코드를 독립시켜서 변경하기 쉬운 상태로 만들어 두자. 예를 들어 이전에 결정된 데이터베이스 관리 시스템을 프로젝트 도중에 변경할 수도 있다. 이때 가역성을 고려해서 데이터베이스 접근 부분이 추상화되어 있다면 현실적인 공수로 변경할 수 있을 것이다.

4.5 코드의 구린내

'코드의 구린내'란 코드 중에서 이해하기 어렵고, 수정하기 어렵고, 확장하기 어렵다고 느껴지는 부분을 뜻한다. 이런 코드가 갖는 문제점에 대해 불길한 징후이자 위험 신호라는 의미에서 구린내라고 부른다.

구린내의 경향

  • 자주 보인다
  • 너무 길다
  • 너무 크다
  • 너무 많다
  • 이름이 맞지 않는다

4.6 기술적 부채

프로그래밍에는 2가지 길이 있다. 하나는 시간이 좀 걸리더라도 깨끗한 코드를 작성하는 길이고, 다른 하나는 신속하지만 지저분한 코드를 작성하는 길이다. 충분한 시간이 주어진다면야 항상 시간이 걸려도 깨끗한 코드를 선택해야겠지만, 시간이 없거나 수정이 긴급하게 이루어져야 하는 상황에서는 신속하지만 지저분한 코드를 선택할 수도 있다. 다만 신속하지만 지저분한 코드를 선택한다면 소프트웨어는 이른바 부채를 떠안는 샘이 되는 데, 이를 '기술적 부채'라고 부른다.