지난 게시글에서 낮은 결합도와 높은 응집도에 대해서 살펴보았다. 이번에는 조금 더 상세한 응집도와 결합도에 대해서 살펴보려고 한다.


Cohesion

Coincidental cohesion (Worst)
모듈의 일부가 우연하게 그룹화 되어있는 경우를 의미한다. 우연적 응집도를 갖는 클래스가 관계를 맺는 경우는 함께 그룹화되어 있는 경우 밖에 없다. 모듈들의 구성요소들은 아무런 관계가 없는 상태로서 존재하고 있는 경우이다.


Logical cohesion

모듈의 일부가 그룹화되는 경우를 의미한다. 예를 들면 마우스와 키보드는 사용자의 입력을 받고 해당 입력에 따라 처리 루틴을 밟아가기 때문에 유사 성격으로 분류하는 경우이다.


Temporal cohesion

각 기능의 요소가 순서에 상관없이 특정 시간에만 수행되는 기능을 묶어놓은 모듈을 의미한다.


Procedural cohesion

공유하는 것은 없으나 하나의 큰 모듈내의 활동들이 절차적으로 수행되는 경우이다. 제어가 다음 활동으로 이동하는 것이다. 예를 들어 파일 권한을 체크하고 이후에 파일을 여는 기능같이 배열된 순서에 맞게 수행되는 경우이다. 


Communicational / Information cohesion

서로 다른 기능의 모듈들이 동일한 자료를 사용하는 경우이다. 입력 값에 따라서 출력 값이 달라진다.


Sequential cohesion

한 모듈의 출력이 다른 모듈의 입력으로 사용되는 경우이다. 일련의 활동들은 체인 형식으로 구성되어 있음을 말한다. 예를 들어 파일에서 데이터를 읽고 데이터를 처리하는 기능


 Functional cohesion (Best) 

모든 명령, 모듈들이 하나읨 문제 해결을 위해서 작업을 수행하는 경우를 일컫는다. 필요한 모든 구성요소를 포함하기 때문에 가장 이상적이며 재사용이 가능하다.


Point

The point is having a the classes as small as possible in terms of elements. The less elements we have the greater the possibility for them to be used all the methods 



Coupling

 Loose Coupling 

앞선 글에서 말했다시피, 결합도는 높은 결합도와 낮은 결합도가 존재하고 낮은 결합도가 가 유지보수를 용이하게 하며, 리팩토링 시간을 지나치게 소비하지 않도록 도와준다. Loose Coupling 과 반대되는 의미로는 Tight Coupling 이 있으며 하나의 오브젝트에서 다른 오브젝트에 대한 인스턴스를 바로 가지는 것은 문제를 일으킬 소지가 크다.


예시는 앞서서 쓴 글 [ Loose Coupling & High Conhesion ] 을 확인하면 된다.


내가 참고한 링크에서는 글쓴이는 결합도에 특별한 경우도 말해주었지만, 빈약한 영어실력 때문에 원문을 그대로 옮겼다.


" Don't talk to strangers ! "


An Object A can request a service (call a method) of an object instance B, but object A should not "reach through" object B to access yet another object, C, to request its services.


Doing so would mean that object A implicitly(절대적으로) requires greater knowledge of object B's internal structure. Instead, B's interface should be modified if necessary so it can directly serve object A's request, propagating it to any relevant sub-components.


Alternatively(또는), A might have a direct reference to object C and make the request directly to that.


In particular(특히), an object should avoid invoking methods of a member object returned by another method, like for example : 


객체는 다른 메소드에 의해 반환된 멤버 객체를 통해 메소드를 호출하지 말아야 한다.


ex) var a = someObject.FirstMethod().SecondMethod();


For many modern object oriented languages that use a dot as field identifier, the law can be stated simply as " Use Only One Dot "



Posted by doubler
,