출처: Code Complete 2, 김도균 감수, 정보 문화

응집성을 높여라

: cosine()하면 오로지 하나, 코사인 계산을 위한 것이다. 그러나 만일 cosineAndTan()하면 한가지 이상의 작업을 하므로 응집성이 떨어진다. 목표는 한가지 일을 잘하도록 하는 것이다.  

우리는 기능성 응집성이 강한 루틴을 작성하도록 해야 한다.

루틴을 작성할 때, 주의 할 점이라면,

  • 순차적 응집성을 피하라.  이것은 루틴이 특정한 순서대로 수행되어야 하고 단계별로 데이터를 공유하여 동시에 수행될 때, 그리고 완전한 기능을 제공하지 못하는 연산ㅇ을 포함할때 존재한다.  예를 들어, 출생일을 입력값으로  받아, 나이와 퇴직일을 계산하는 루틴이 있다고 하자.  만일 이 루틴이 나이를 계산하고 그 결과 값을 토대로 퇴직일을 계산한다면 이 루틴은 순차적 응집성을 지닌다.  반면에 만약에 루틴이 나이를 계산하고 동일한 출생일 데이터를 사용하는 완전히 독립적인 계산 방법으로 퇴직일을 계산한다면 이 루틴은 통신적 응집성만 갖는다.  그러므로 우리는 나이계산 루틴과 퇴직일 계산 루틴을 생성해, 퇴직일 루틴이 나이 루틴을 호출하도록 한다. 그러면 이 두 루틴은 기능성 응집을 갖는다.

  • 통신적 응집성은 루틴에 있는 연산들이 동일한 데이터를 사용하지만 서로 아무런 연관이 없을 때 발생한다.  만약 어떤 루틴이 요약 보고서를 출력하고, 루틴으로 넘어온 요약 데이터를 다시 초기화한다면, 이 루틴은 통신적 응집을 갖는다. 이 루틴에 보다 나은 응집성을 제공하기 위해서는 요약 데이터가 생성된 곳 근처에서 다시 초기화되어야 하며, 보고서 출력 루틴 안에 있어서는 안된다.  이 연산들을 개별적 루틴으로 나누어라.

  • 일시적 응집성은 연산들이 동시에 수행하기 때문에 한 루틴안에 결합되어 있는 경우다.  예를 들면, startUp()이나 showDown()들이겠다.  이 루틴을 효율적으로 만들기 위해서는 응집된 루틴이 연산들을 직접적으로 하기보다는, 다른 루틴을 호출하는 것으로 만드는게 좋다.

다음은 수용하기 어려운 응집성의 종류이다.

  • 절차적 응집성은 루틴에 있는 연산들이 특정한 순서대로 수행될 때 발생한다.  예를 들어 데이터를 순차적으로 입력 받을때, GetFirstName(), GetLastName()같이 부르고, 이 루틴은 연산들을 특정한 순서대로 사용하지만, 연산들이 결합 할 필요는 없기 때문에 절차적 응집성을 갖는다.  다시 말하면,GetFirstPartOfEmployeeData() 대신, GetEmployee()같은 루틴을 작성하라.

  • 논리적 응집성은 여러가지 연산들이 한 루틴에 채워져 있고, 연산 중 하나가 루틴에 전달되는 제어 플래그에 의해서 선택될 때 발생한다. 만일 이벤트 핸들러의 역활로 사용된다면 좋은 설계로 볼 수 도 있으니 주의하자.

  • 우연성 응집은 루틴에 있는 연산들이 서로를 인식할 만한 관계를 가지고 있지 않을 때 발생한다.



'소프트웨어 엔지니어링' 카테고리의 다른 글

[용어] Payload란?  (0) 2014.07.18
[terminology] reap  (0) 2014.01.11
아파치 라이센스 2.0 사용법  (0) 2012.04.12
루틴: 루틴이름, 루틴길이,  (0) 2011.11.09
Posted by code cat