Design Patterns2008. 6. 21. 17:12

객체지향 설계 원칙 5-3 SRP (Single Responsibility Principle) 단일 책임의 원칙

먼저 단일책임의 원칙을 한마디로 표현하자면 다음과 같다.

"하나의 객체는 하나의 책임만을 가진다" 

이다. 여기서 책임이란 말의 의미는 변경해야할 이유라고 보면 되겠다. 그러니까 다시 풀어서 얘기 하자면

"하나의 객체는 오직 한가지의 이유로 인해서만 변경되어야 한다."

정도가 되겠다.
평소에 소스를 보면서 복잡도, 결합도가 높다는 말을 많이 듣거나 사용했을것이다. 이게 바로 그말이다 ㅡㅡ

그러면 이제 간단한 샘플을 보면서 단일 책임이 무엇인지 알아보겠다.

내가 요즘 주식 재미에 푹~ 빠졌다. ㅎㅎ
그래서 주식관련한 샘플이 갑자기 생각났다.

다음의 클래스 구성도를 보자

사용자 삽입 이미지

[그림1]


샘플 클래슨 바로 주가 정보를 계산해서 알려주는 "주가정보" 클래스이다.
이 객체는 코스피 주가를 알고 싶은 객체와 코스닥 주가를 알고 싶은 객체가 사용하게 될것이다.

그러면 이 주가정보 객체에는 어떠한 문제점이 보이는가 ?
먼저 코스피정보만 취급하는 곳 에서는 코스닥 정보가 필요없다. 반대로 코스닥만 취급하는 곳 에서는 코스피 정보가 필요가 없다. 그러면 "현재코스피()", "현재코스닥()" 인터페이스중 하나는 불필요한 인터페이스가 될수 있다. 이런 문제는 크게 문제가 되어 보이지 않는다. 어차피 필요한 것만 가져다 쓰면 되기 때문이다. 하지만 많은 인터페이스가 존재한다면 복잡도가 증가될수는 있겠다.

그러면 더 큰 문제는 무엇인가 ? 이 문제는 주가정보 객체가 업데이트 되어야 할때 발생한다.
만일 코스피 정보를 알려주는 내부로직이 아무런 변경이 없고 코스닥 정보를 알려주는 내부로직이 변경되었다면 코스피 정보만 사용하는 곳에서는 불필요하게 주가정보 객체가 업데이트 되는것이다.

왜 이런 문제들이 발생하는 것일까 ? 그것은 주가정보 객체가 두가지의 책임을 가지고 있기 때문이다. 위에서 책임은 무엇이라고 했는가 ? "책임이란 객체가 변경되어야 할 이유이다." 라고 했다. 그렇다 이 주가 정보 객체는 변경되어야 하는 이유가 두가지인 것이다.

그러면 어떻게 이 문제를 해결할 것인가 ? 해결의 답은 간단한다. 두개의 책임을 하나씩 나누는 것이다. 주가 정보 객체를 코스피 정보를 계산해서 알려주는 객체와 코스닥 정보를 계산해서 알려주는 객체로 나누는 것이다. [그림2] 와 같다.

사용자 삽입 이미지

[그림2]


이 밖에도 하나의 객체가 하나의 책임을 가지지 못하면서 발생하는 문제는 또 있다. 예들들어 하나의 책임을 여러개의 객체에서 같이 가지고 있다면 어떻게 될까 ? 바로 산탄총에 맞은 사람을 수술하는 의사가 될것이다. 일반 총에 맞으면 하나의 상처가 생긴다. 그러나 산탄총에 맞은 사람은 몸의 여러군데에 상처가 생긴다. 그래서 산탄총에 맞은 환자를 수술하려면 같은 한방을 맞더라도 여러군데를 시술해야 한다.

개인적으로 보면 5가지 원칙중 "단일 책임의 원칙" 이 제일 직관적이고 이해하기가 쉽다. 그것은 C 를 배울때 부터 이러한 얘기를 많이 들어와서 였던거 같다. 예들들어 처음 C 를 시작하면서 많이 듣는 얘기중 하나가 "하나의 함수에는 하나의 기능만을 넣어서 함수를 만들어라" 란 말을 많이 들어왔을 것이다.

그러나 사실 객체를 설계하면서 책임을 구분하고 나눈는일 자체가 쉽지 않다.ㅠㅠ
계속 반복하는 얘기지만 이런부분은 경험으로 채워가는 방법밖에 없다. 항상 생각하며 일하라.
Posted by 상현달