콘텐츠로 건너뛰기

High Cohesion, Loose Coupling

상속과 인터페이스
여러분은 OO 하고 있습니까??

High Cohesion, Loose Coupling – 높은 응집도 그리고 낮은 결합도(또는 느슨한 결합)

학교에서 소프트웨어 공학 시간을 통해서 배웠고, 또한 ‘임백준의 소프트웨어 산책’이라는 책을 읽으면서 다시한번 개념 다지기에 들어갔다. 그리고 나는 은근히 이것들에 집착(?)한다.

소프트웨어에게도 수명이라는 것이 있다. 시간이 지날수록 나이는 먹어가고.. 그러다가 많은 시간이 흘러 나이를 많이 먹으면 죽는 거다.(단순히 나이를 많이 먹어서 죽는 것은 아니지만)

건강하게 태어난 소프트웨어는 살아가는 동안 쉼없이 자신을 확장하게 된다. 새로운 능력이 더 필요하다면 그는 얼마든지 자신을 확장한다. 부족한 부분이 있다면 그것에 대한 보완도 하며 그는 열심히 살아간다. 아~주~ 오래오래 행복하게 살아간다. 오래오래 행복하게 살아가는 소프트웨어를 보고 있자면 그를 태어나게 한 개발자들도 그를 기특하게 여기며 뿌듯해 한다.

탄생하면서 스파게티 소스를 간직하고 태어난 허약한 소프트웨어는 수명이 매우 짧다. 비운의 소프트웨어다. 아.. 상상하니 눈물이 마구 흘러 내린다. ㅠㅠ

어느 날 허약한 소프트웨어에게 앞으로 해야 할 일은 오른팔을 많이 사용해야 하니 오른팔을 단련해 두라는 지시가 내려왔다. 그는 열심히 팔의 근육을 확장해서 새로운 업무에 필요한 튼튼한 오른팔을 만들어냈다. 그런데 이게 왠일인가. 오른팔만을 확장했을 뿐인데 갑작스레 왼발이 저려온다. 이유는 알 수 없지만 왼발이 자꾸 저려서 그는 쩔뚝쩔뚝 다리를 절어 가면서 일을 하게 된다. 일단 일은 할 수 있으니 다행이다. 다음번엔 왼팔을 확장했는데 오른쪽 다리가 저려온다. 자꾸자꾸 몸에 원인모를 이상증세가 찾아오다 결국 그는 일을 할 수 없게 되었고 그는 얼마 지나지 않아 죽게 되었다. 스파게티 소스때문에..ㅠㅠ 불쌍한 친구..ㅠㅠ

프로그램의 소스가 스파게티 같다
프로그램의 소스가 스파게티 같다

그가 계속 살아갈 수 있는 방법은 있었다. 리팩토링(Refactoring)이라는 수술을 받으면 그는 살아갈 수 있다고 했다. 하지만 비교적 작은 수술로 재기할 수 있었던 건강한 소프트웨어와는 다르게 그는 큰 수술을 필요로 했고 수술비도 만만치가 않았다. 태어나면서부터 선천적으로 가진 ‘스파게티 소스’라는 병 아닌 병 때문에 말이다.

건강한 소프트웨어를 만들고 싶다. 건강하게 오래오래 사는 소프트웨어는 높은 응집도와 낮은 결합도를 가지고 있다. 그는 유연해서 어떤 일이든 어렵지 않게 배운다. 유연하고 모든 쉽게 잘 할 수 있는 이런 녀석이 정말 튼튼하고 건강한 놈이다.

그래서 나는 코드를 만들 때 결합도와 응집도에 대한 많은 고민을 한다. 그가 다른 것에 의지하지 않도록 다른 객체와는 느슨하게 결합하고, 응집도는 높게 독립적으로 만들려고 고민을 한다. 그런데 슬프게도 난 고민만 열심히 했지 High Cohesion, Loose Coupling을 충족하게 만들지는 못하고 있다. 다만 스파게티를 뽑아내지 않으려 노력하고 있을 뿐이다. 나는 요리사가 아니니까 말이다.

여러분은 OO하고 있습니까?…. 뜬금 없지만

OO: Object Oriented


2 개의 댓글

  1. 객체지향이라면 항상 생각을 해 두고 프로그래밍을 하죠 ㅎㅎ
    하지만, 나중에 보면 어느샌가 꼬여있지만요 ㄷㄷㄷ

    1. 그런데 말이죠. 어디선가 읽었던 글인데.. 저 처럼 저렇게 집착하는게 초보 개발자들이 흔이 저지르는 실수라고 하더라구요.

      초보 개발자들은 소프트웨어의 유연성을 생각하며 완벽하게 만들기 위해 초기설계에 상당히 많은 시간을 할애한다고 합니다. 그런데 막상 코딩에 들어가면 원했던 유연성과 생각했던 모든 것들은 점점 사라져 가면서 소스가 스파게티화 된다고 하네요.

      그러면서 그 글의 결론은…
      “많이 개발해 보고 시간이 흐르면 자연스럽게 해결되는 문제이고 자연스럽게 능력을 얻을 수 있으니 고민하지 마라~”
      였던걸로 기억합니다. 제가 맞게 기억하는건지는 모르겠습니다..;;ㅎㅎ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다