본문 바로가기

issue & tip

응집도

반응형

응집도

- 모듈에 포함된 기능의 순수함을 나타내는 척도로, 모듈의 강도를 측정하는 단위

-하나의 모듈 내부의 처리 요소들 간의 기능적 연관성을 측정하는 척도

-모듈안의 요소들이 서로 관련되어 있는 정도 즉, 모듈이 독립적인 기능으로 정의되어 있는 정도를 말하는 것으로, 독립적인 모듈이 되기 위해서는 각 모듈의 응집도가 강해야 한다.


응집도의 목표

- 가능한 높은 응집도를 추구하여 유지보수 용이성을 확보


1단계: 암합적 강도(Coincidental Cohesion)

암합적 강도 모듈은 모듈 내 요소  간 특별한 관계가 인정되지 않는다.

암합이란 우연히 요소가 일치한다는 의미이다.

예) 모듈 내 중복된 명령의 패턴을 우현히 발견했다는 이유로 통합해서 하나의 모듈로 만든  경우다.

이때는 해당 모듈의 기능을 바르게 명명해서 정의할 수 없다.

모듈은 여러 개의 전혀 관계가 없는 기능(암합)을 처리하고 있기 때문이다.


모듈 A의 처리 a와 처리 b 사이에는 특별한 관련이 없다.

모듈 B내의 여러 곳에 우현히 이런 명령의 패턴이 나타났기에 하나의 모듈로 모았을 뿐이다.


서로 관계없는 많은 기능을 포함한 모듈 A는 명령의 일부만을 변경할 가능성이 높다고 할 수 있다.

이때 모듈 A를 호출하는 모듈 B의 다른 부분이 해당 변경과 관계없다면  모듈 A 는 더이상 사용할 수 없다.

그리고 모듈 설계의 전면적인 재검토가 필요해진다.

암합적 강도 모듈 내의 각 요소는 자기 모듈 내 다른 요소와 관련성은 약하면서도 다른 모듈 내 요소와는 강한 관련을 갖는 경향이 있다.

그렇기 때문에 다른 모듈에서 변경이 이루어지면 크게 영향을 받게 되어 보수하기 어렵다.

게다가 모듈의 기능을 바르게 정의할 수 없다는 말은 재사용할 가능성도 적다는 뜻이다.


-모듈 내부의 각 구성요소들이 서로 관련 없는 요소로만 구성된 경우

-논리적 응집력과 유사하지만, 활동이 동일한 유형이 아니며 모듈을 수정할 때마다 ‘부작용’을 유발할 가능성이 높다. 

-Utility class : 이 클래스는 public 및 static 함수의 콜렉션을 포함하며, 다른 클래스에서 액세스 할 수 있습니다. 그리고 Utility class의 변경사항은 이 클래스를 액세스하는 다른 클래스에도 영향을 미칩니다.



// 모듈 내부의 각 구성요소들이 연관이 없을 경우

1.

module B {

addNumber(num1, num2)

displayTerminal(text)

....


addNumber(num1, num2)

displayTerminal(text)


}


2. 중복된함수들을 묶어서 만듬

module A {

service() { 

addNumber(num1, num2)

displayTerminal(text)

}

}


3. 모듈 A를 호출하여 사용

module B {

A.service()



A.service()

}


4. 모듈 A의 함수들은 서로 연관이 없음




2단계: 논리적 강도(Logical Cohesion)

어떤 기능을 추상적으로 파악해서 모은 것이다.

예) 모든 입출력 조작을 모아서 모듈화하거나 여러가지 데이터를 편집하기 위한 모듈을 작성한 경우다.

이때 모듈 내의 논리는 조건에 따라 실행 경로가 달라진다.

즉, 논리적 강도 모듈은 관련 있는 몇 가지 기능을 포함하면서 그중 하나만이 호출 모듈에 의해 식별되어(논리), 실행되는 모듈을 뜻한다.

그렇기 때문에 모듈이 호출되었을 때 실행되는 명령은 일부 뿐이다.

모듈 내의 모든 명령이 실행되는 것이 아니다.

내포된 명령들의 관련성이 약하고 모듈 강도는 약해진다.

호출 모듈과 인터페이스, 즉 입출력 파라미터가 다른 여러 개의 기능과 같은 것이 사용되므로 파라미터를 취급하는 프로그래머가 실수하기 쉽게 만든다는 면이 있다.

다만 논리적 강도에는 좋은 면도 있다.

우선 기능적으로 다수의 공통 부분을 포함하고 있으므로 일부의 논리는 공유할 수 있는 점이 있다.

관련된 기능을 하나의 모듈로 모은 것은 프로그래머의 사고를 집중시키는 효과가 있다.

게다가 특정 데이터의 처리를 하나의 모듈로 국소화하는 효과도 있다.

즉, 정보 은닉을 할 수 있다는 뜻이다.

이렇게 하면 어떤 데이터에 관한 변경이 생겼을 때 해당 모듈만 변경하면된다.


- 논리적으로 유사한 기능을 수행하지만 서로의 관계는 밀접하지 않음

-유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들로 모듈을 형성하는 경우

-모든 마우스 및 키보드 입력 처리 루틴 그룹화


//유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우

module input {

keyboardInput()

mouseInput()

}



void readWrite(int type, int* data, int size) {

      switch(type) {

            0: read(data, size);

            break;

            

            1: write(data, size);

            break;

      }

}



3단계: 시간적 강도(Temporal Cohesion)

시간적 강도 모듈은 특정 시점에 연속해서 실행되는 여러 개의 기능을 하나의 모듈로 모은 것이다.

이때 기능 사이에 그다지 강한 관련성은 없다.

다만 특정 시점에 연속해서 실행될 뿐이다.

대표적인 사례가 초기 처리 모듈이다.

소프트웨어의 초기 처리에서는 강한 관련성이 없는 작업 영역 작성이나 각종 테이블의 초기화와 같은 작업을 실행 초기에 모아서 수행한다.


-모듈의 기능 요소들이 같은 시간에 모두 실행

-각 기능 요소가 순서 상관없이 특정시점에 반드시 수행되는 기능이 모여 있는 경우

-열린 파일을 닫을 때 예외사항이 발생한 후 호출되는 함수를 예를 들수 있습니다. 오류 로그를 작성하고, 사용자에게 알리는 기능이 순서에 상관없이 수행됩니다.


//연결된 기능이라기 보다 특정 시간에 처리되어야 하는 활동을 한 모듈에서 처리되는 경우

// 특정시간대(초기실행)에 실행되어야 하는 함수들 모임

module init {

init()

memset()

}


4단계: 순서적강도/절차적 강도(Procedural Cohesion)

순서적 강도 모듈은 문제를 처리하기 위해 관계된 여러 개의 기능 중 몇 가지를 실행한다.

여러 개의 기능은 순서대로 실행된다.

기본적으로 시간적 강도의 특성을 갖는데, 기능 사이에 순서적인 관련성이 있는 만큼 시간적 강도보다는 강도가 강하다.

순서적 강도 모듈은 여러 개의 기능 중 하나만 필요할 때 사용할 수 없다.

사용하려면 기능 선택이 필요하다. 다만 그렇게 하면 논리적 강도가 되므로 강도가 떨어진다.

커다란 기능의 일부 순서를 하나의 모듈로 만들었다면 순서적 강도이다.

순서도의 일부를 모듈화한 경우 등이 여기에 해당한다.



-모듈이 다수의 관련 기능을 가질 경우, 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우

- 관련없는 기능요소가 배열된 순서로 수행되는 것으로 한 모듈내의 활동들이 순차적으로 수행한다.

-요소들이 서로 관련이 없다는 점을 제외하면 순차 응집력과 유사합니다.


//항상 특정 실행 순서를 따라 그룹화 하는 것

//openFile은 대체적으로 checkAuth함수로 체크하고 실행해야됨

module fs {

checkAuth()

openFile()

}


모듈 A

기능a

기능b



5단계: 연락적강도 / 통신적 응집도(Communicational Cohesion)

연락적 강도 모듈은 기본적으로 순서적 강도의 특성을 갖는다.

순서적 강도와의 차이점은 모듈 내 기능 사이에서 데이터를 교환(연락)하거나 같은 데이터를 참조한다는 점이다.

모듈 내 기능이 데이터에 대해 이어져 있는 만큼 순서적 강도보다는 응집도가 높다.



- 서로 다른 기능이 동일자료를 사용하나 처리순서는 상관없음

- 모듈의 모든 기능이 동일한 데이터 구조를 참조하거나 업데이트하는 경우 모듈은 통신적 응집력을 가지고 있다고 합니다.

- 배열 또는 스택에 정의된 함수 집합


//동일한 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여있을 경우

module nameControl {

//DB에 저장된  name

print(name)

select(name)

}


모듈A

  기능 a

  데이터 X


  기능 b



6단계: 정보적 강도 / 순차적 응집도(Sequential Cohesion)

정보적 강도 모듈은 특정 자료구조를 다루는 여러 개의 기능을 하나의 모듈로 모은 것이다.

같은 자료구조(정보)는 가능한 한 특정 모듈에서만 접근하도록 하겠다는 발상이다.

이렇게 하면 데이터 수정 시 영향을 모듈 내로 한정할 수 있어 정보 은닉 면에서도 유리하다.


논리적 강도 모듈 역시 정보 은닉의 특징을 갖고 있지만, 정보적 강도 모듈과의 차이점은 진입점의 개수다.

논리적 강도 모듈은 진입점을 하나만 가지며 실행할 기능은 파라미터에 의해 선택된다.

반면에 정보적 강도 모듈은 진입점을 여러개 가지며 각 진입점은 단일한 고유 기능을 실행한다.

진입점별로 고유의 파라미터를 갖기 때문에 파라미터를 다루기 어려웠던 논리적 모듈의 단점을 해소할 수 있다.


- 한 활동의 출력이 다음 활동의 입력으로 사용

- 파일에서 데이터를 읽고 데이터를 처리하는 기능


//모듈내에서 한 할동으로 부터 나온 출력값을 다른 활동이 사용할 경우

module DataControl {

getData()

deleteData(data)

//getData 함수에서 출력된 data값을

//deleteData 함수에서 입력으로 사용

}



                    모듈 A

진입점 -----기능a

진입점 -----기능b               자료구조 s

진입점 -----기능c



7단계:기능적강도 /  기능적 응집도(Functional Cohesion)

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

단일 기능을 수행하기 위해 모든 명령이 서로 관련된다.

이때는 일부 명령만 변경할 가능성이 작아진다.

설령 변경한다고 해도 변경 이유는 이 모듈을 사용하는 다른 모듈의 공통적인 상황에 따른 가능성이 높다.

즉, 기능적 강도를 갖는 모듈의 변경은 해당 모듈만으로 처리할 수 있다.

다른 모듈에 미치는 영향도는 다른 강도의 영향도보다 작다.


- 모듈 내부의 모든 기능 요소들이 단일 문제와 연관되어 수행될 경우

- 모든 명령이 한가지 문제해결을 위한 작업을 수행

- 코사인 계산


//모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우 강한 단일 지향적인 목표를 가지는 모듈이어야 한다.

단 한가지의 책임을 가져야 한다.


XML 어휘 분석 모듈

거래 기록 읽기 모듈



출처 - 프로그래밍의 정석



반응형

'issue & tip' 카테고리의 다른 글

토비의 봄 TV 재사용성과 다이나믹 디스패치 그리고 더블디스패치  (0) 2018.06.01
결합도  (0) 2018.05.17
파일 입출력  (0) 2018.04.25
래퍼클래스와 제네릭  (0) 2018.04.24
부동소수점  (0) 2018.04.24