[책 스터디][오브젝트] 1장. 객체, 설계
본 내용은 오브젝트 책을 보고 공부, 정리한 내용입니다.
본 글에 등장하는 실습 링크는 이곳을 참고해 주세요.
로버트 마틴의 클린 소프트웨어 中 - 소프트웨어 모듈의 목적 세 가지
- 실행 중 제대로 동작해야 한다.
- 모듈은 변경을 위해 존재한다. 즉, 변경하기 어려운 모듈은 제대로 동작하더라도 리팩토링할 필요가 있다.
- 코드를 읽는 사람이 이해하기 편해야 한다. 즉, 코드의 흐름이 상식선에서 예상 가능한 코드여야 한다.
소극장 티켓 판매 구현해보기
실습 링크의 theater/procedural branch 참고
무엇이 문제?
- 로버트 마틴의 소프트웨어 모듈의 목적 세 가지를 대입해보면
- 실행 중 제대로 동작한다!
- Theater 클래스는 Audience, Bag, Ticket, TicketOffice 무려 네 개의 클래스에 의존하고 있다. 이 중 하나의 코드가 변경되면, Theater 클래스도 변경되어야 할 확률이 높다.
- Theater 클래스의 enter()를 보고, 어떤 과정으로 진행되는건지 한 눈에 이해하기 어렵다. 목적1은 만족하지만, 목적 2, 3은 만족하지 못한다.
-
이같은 문제가 발생하는 이유는? “예상을 빗나가는 코드” & “변경에 취약” 하기 때문이다. Theater의 enter() 내부를 살펴보면, Audience와 TicketSeller는 수동적이다. 객체지향 패러다임에서 객체는 자신의 데이터를 자신이 직접 관리해야 한다. 현재 코드는 Theater는 “절차” 를 갖고 있고, 나머지 클래스들은 단지 “데이터” 로써의 역할만 수행하는 절차지향적 패러다임이다.
- 해결 방법
- 객체가 자율적으로 자신의 데이터를 자신이 관리하게 만들자
- 캡슐화를 이용해 객체의 데이터를 숨기고, 외부에 인터페이스를 제공하자.
- 객체의 자율성을 높이면 객체 간 결합도 및 의존성은 낮아지고, 응집도는 상승한다.
응집도
객체가 자신과 밀접히 연관된 작업만 수행하고, 그 외 작업은 다른 객체에 일임하는 정도 - 객체가 자율적으로 자신의 데이터를 자신이 관리하게 만들자
객체지향 패러다임에 맞게 코드 리팩토링
실습 링크의 theater/object-oriented branch 참고
객체지향 패러다임 설계의 핵심
-
객체의 자율성을 높이자! 자율성을 높인다는 건, 객체가 자신의 데이터를 자신이 직접 관리하는 것이다. 아울러 캡슐화를 통해 외부에는 반드시 필요한 메서드(인터페이스)만 노출하자. 객체의 자율성을 높이면, 객체 간 의존성과 결합도는 낮아지고 응집도는 상승한다. 실세계에서는 수동적인 객체라도, 프로그래밍 세계에서 모든 객체는 자율적이어야 한다. (= 의인화)
-
객체는 자신의 책임(역할)만 관리하고, 그 외 관심사는 다른 객체에게 요청한다.
-
어느 정도 객체지향 패러다임에 맞게 설계를 했다면, 이후부터는 trade-off이다. 객체지향적으로 설계하면 의존성이 항상 낮아지는 것은 아니다. (ex. 예제 코드에서, TicketOffice와 Audience의 의존성이 추가된 상황)
좋은 설계란 오늘 구현할 기능이 제대로 동작하도록 코드를 배치하면서, 내일 있을 변경에 유연하게 대처할 수 있는 설계이다.