낮은 결합도, 높은 결합도응집도

소프트웨어 공학의 전통적인 이론에 따르면, 유지보수성이 높은 소프트웨어는 프로그램의 각 요소들이 결합도는 낮게, 응집도는 높게 구성되어야 한다.


결합도(coupling)란?

소프트웨어 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 또한 얼마나 의존적인지 나타내는 정도이다. 프로그램의 요소가 결합도가 낮다는 것은 그것이 다른 요소들과 관계를 그다지 맺지 않은 상태를 의미한다.


결합도가 높은 클래스의 문제점

  • 연관된 다른 클래스가 변경되면 더불어 변경해야 하고,
  • 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스를 함께 이해해야 하고
  • 나중에 다른 프로그램에서 클래스를 재사용하기도 힘들다.



응집도란(cohesion)?

프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도이다. 일반적으로 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집도가 높다고 표현한다. 응집도가 높으면 프로그램을 쉽게 이해할 수 있으므로 유지보수성이 높아진다.


응집도가 낮은 클래스의 문제점

  • 이해하기 힘들고
  • 따로 재사용하기 힘들며
  • 유지보수하기 힘들고
  • 다른 클래스의 변화에 민감하다.


예)


다른 기능 영역의 메소드들을 다수 포함한 클래스

  • 이런 클래스는 대개 X and Y와 같은 식으로 이름을 붙인다. 한 클래스 안에 여러 기능 영역의 메소드가 들어 있어, 클래스가 한 가지 기능에 집중하지 못하는 일이 많다. 예를 들어, 이미지 처리하는 기능과 사운드 처리하는 기능을 같이 갖고 있으면 그 클래스는 응집도가 낮은 것이다.


너무 많은 책임을 짊어진 클래스

  • 같은 기능영역의 메소드로 구성되었지만 클래스내에 그들이 모두 구현된 경우로서 너무 많은 책임을 짊어지다 보니 클래스의 크기가 엄청나게 커진 경우이다. 다른 클래스가 해야 적당한 기능을 자신이 억지로 하려고 하니까 크기가 커진 것이다. 예를 들어, 돈의 지불(현금, 수표, 신용카드)과 관련된 모든 기능을 Payment(지불)라는 클래스에 넣으면 이 클래스는 응집도가 낮아진다. 이럴때는 현금, 수표, 신용카드의 공통된 결제 기능을 Payment 클래스에 정의하고, 각자 고유한 기능은 Cash, Check, CreditCard 등의 Payment를 상속받은 하위 클래스에 정의하는 것이 응집도를 높이는 방법이다.


 


응집도가 높은 클래스의 특징

  • 클래스의 목적에 부합하는, 같은 기능영역( function area )의 메소드들로 구성되어 있다.
  • 메소드의 개수가 상대적으로 작다. 그것은 오로지 자신만이 할 수 있는 책임을 부여 받았다는 뜻이다.
  • 혼자 너무 많은 일을 하지 않는다. 다른 클래스와 협력한다.


+ Recent posts