루비로 배우는 객체지향 디자인
처음 구매 했을때는 주변 루비 개발자분들이 좋은책 이라고 해서 구매했지만 막상 읽지를 않고 책장에 꽃혀있던 책을 블로그 포스팅을 위해 꺼내서 읽었습니다.
작성은 각 장에서 깨달은 내용을 적을 예정이고 총 9장까지 있습니다.
책 제목은 루비지만 꼭 루비가 아니더라도 객체지향 디자인을 원하는 사람에게는 좋은 책이라는걸 느꼈습니다.
4. 유연한 인터페이스 만들기
이전의 챕터들을 통해 객체지향 어플리케이션에서는 클래스로 모든걸 다 해결 할 수 있을 것 같아보이고 클래스의 책임과 의존성을 중심으로 디자인이 논의 되고 끝나는 경향이 생길 수 있지만 실제 객체지향 어플리케이션은 각 객체간의 메세지를 통해 동작하기 때문에 이를 주의해야 합니다.
지금까지 내용을 봤을 때 객체지향 디자인에서 중요시 해야하는 부분은 객체의 책임, 의존성, 그리고 어떻게 소통하는지가 됩니다.
그리고 이런 객체간의 소통은 인터페이스를 통해 이루어집니다.
인터페이스 이해하기
위에서 객체간의 소통을 인터페이스를 통해 이루어진다고 했습니다.
인터페이스는 크게 2가지로 분류가 되는데 클래스로부터 독립된 인터페이스와 객체 내부에 구현된 인터페이스가 있습니다.
객체 내부에 구현된 인터페이스는 외부로 노출되는 퍼블릭 인터페이스와 내부에서만 공유되는 프라이빗 인터페이스로 구분이 됩니다. 클래스로부터 독립된 인터페이스는 메세지의 묶음으로 표현되기도 합니다.
이번 4장에서는 이 중에서도 클래스내의 메서드를 다루는데 그 중에서도 어떤 부분을 노출 할지를 다루고 이후 5장에서는 클래스로부터 독립된 인터페이스, 메세지의 묶음을 알아보도록 하겠습니다.
인터페이스 정의하기
여기서는 예시를 통해 퍼블릭 인터페이스와 프라이빗 인터페이스를 나누는 기준과 정의를 하는 방법을 알아 볼건데 예시가 간단해 쉽게 이해할 수 있었습니다.
레스토랑의 부엌을 봤을 때, 손님은 메뉴판을 보고 음식을 주문합니다.
그러면 손님의 주문은 홀과 부엌을 지나 부엌으로 전달되고 음식이 나오게 됩니다.
- 퍼블릭 인터페이스 : 메뉴판
- 프라이빗 인터페이스 : 부엌에서 일어나는 일들
조금 더 각각의 특징을 정리해보겠습니다.
퍼블릭 인터페이스
- 클래스의 핵심 책임을 드러낸다.
- 다른 객체에 의해 호출될 수 있다.
- 쉽게 변경되지 않는다.
- 다른 객체가 안정적으로 의존할 수 있다.
- 테스트를 통해 꼼꼼하게 문서화되어 있다.
프라이빗 인터페이스
- 세부적인 구현을 담당한다.
- 다른 객체에 의해 호출되지 않는다.
- 필요에 따라 언제든 변경될 수 있다.
- 다른 객체가 의존하기에는 위험하다.
- 테스트에서 다루지 않을 수도 있다.
실제로 프라이빗 인터페이스의 경우에는 테스트 코드를 작성하지 않는 경우도 있었습니다.
퍼블릭 인터페이스를 설계할 때 비교적 싼 비용으로 설계에 도움을 주는 방법이 있습니다. 시퀸스 다이어그램이라고 부르는 UML 로 메세지 전달과 그 메세지를 요청하고 받는 객체에 대한 정의를 할 수 있습니다.
그리고 제일 중요한 부분인데 이러한 시퀀스 다이어그램을 그리거나 다른 방법으로 객체와 메세지를 설계할 때 기존의 객체 기반 디자인에서 메세지 기반 디자인으로 설계 방법을 바꾼다면 좀 더 유연한 어플리케이션을 만들도록 도움을 줍니다.
메세지 기반 디자인에서 메세지를 얻기 위해 어떻게 해야 하는지 보다는 어떤 메세지를 요청 할 지를 디자인 한다면 의존성 관리 측면에서 도움이 됩니다.
마지막으로 객체지향 디자인에 있어 객체가 있기 때문에 메세지를 보내는게 아닌 메세지를 보내기 때문에 객체를 갖게 되었다는 점을 기억하면 좋습니다.
인터페이스를 만들떄 주의 해야하는 점
- 명시적인 인터페이스 만들기 (퍼블릭, 프라이빗 구분)
- 다른 이의 퍼블릭 인터페이스 존중하기
- 프라이빗 인터페이스에 의존할때는 주의를 기울인다
- 최소한의 맥락 속에 위치시키기 (다른 객체와의 연계 부분을 최소화 하기)
지금까지 객체의 책임, 의존성, 인터페이스에 대해서 알아보았습니다.
책에서는 이후 데메테르의 원칙에 대해 설명하고 있는데 이는 좀 더 자세히 알아보고 정리하고 싶어 다음으로 미루겠습니다.