본문 바로가기

도서/Object

(5)
[Object] Chapter 05 - 책임 할당하기 책임에 초점을 맞춰서 설계할 때 직면하는 가장 큰 어려움은 어떤 객체에게 어떤 책임을 할당할지를 결정하기가 쉽지 않다는 것이다. 책임 할당 과정은 일종의 트레이드오프 활동이다. 동일한 문제를 해결할 수 있는 다양한 책임 할당 방법이 존재하며, 어떤 방법이 최선인지는 문맥에 따라 달라진다. 이번에 살펴볼 GRASP 패턴을 통해 책임 할당의 어려움을 해소할 수 있다. GRASP 패턴을 이해하고 나면 응집도와 결합도, 캡슐화 같은 다양한 기준에 따라 책임을 할당하고 결과를 트레이드오프 할 수 있는 기준을 배울 수 있다. 01 책임 주도 설계를 향해 데이터 중심의 설계에서 책임 중심의 설계로 전환하기 위해서는 다음 두 원칙을 따라야 한다. 데이터보다 행동을 먼저 결정하라 협력이라는 문맥 안에서 책임을 결정하라 ..
[Object] Chapter 04 - 설계 품질과 트레이드오프 01 데이터 중심의 영화 예매 시스템 객체지향 설계에서는 두 가지 방법을 이용해 시스템을 객체로 분할할 수 있다. 첫 번째 방법은 상태(데이터)를 분할의 중심축으로 삼는 방법이고, 두 번째 방법은 책임을 분할의 중심으로 삼는 방법이다. 데이터 중심의 관점에서 객체는 자신이 포함하고 있는 데이터를 조작하는 데 필요한 오퍼레이션을 정의한다. 책임 중심의 관점에서 객체는 다른 객체가 요청할 수 있는 오퍼레이션을 위해 필요한 상태를 보관한다. 데이터 중심의 관점은 객체의 상태에 초점을 맞추고, 책임 중심의 관점은 객체의 행동에 초점을 맞춘다. 훌륭한 객체지향 설계는 데이터가 아니라 책임에 초점을 맞춰야 한다. 이유는 변경과 관련이 있다. 객체의 상태는 구현에 속한다. 구현은 불안정하기 때문에 변하기 쉽다. 상태..
[Object] Chapter 03 - 역할, 책임, 협력 01 협력 협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. 한 객체는 어떤 것이 필요할 때 다른 객체에게 전적으로 위임하거나 서로 협력한다. 즉, 두 객체가 상호작용을 통해 더 큰 책임을 수행하는 것이다. 메시지 전송을 통해 자신의 요청을 전달할 수 있다. 메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 여기서 객체가 메시지를 처리할 방법을 스스로 선택한다는 점이 중요하다. 외부 객체는 메시지만 전할 수 있을 뿐, 메시지를 어떻게 처리하는지는 메시지를 수신한 객체가 결정한다. 이는 객체는 자신의 일을 스스로 처리하는 자율적인 존재라는 것을 의미한다. 객체를 자율적으로 만드는 가장 기본적인 방법은 내부 구현을 캡슐화하는 것이다. 정리하자면, 자율적인 객체는 외부의 도움이 필요한 경..
[Object] Chapter 02 - 객체지향 프로그래밍 01 협력, 객체, 클래스 객체지향은 객체를 지향하는 것이다. 1. 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지를 먼저 결정해야 한다. 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게 만든다. 2. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야 한다. 객체는 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다. 02 도메인의 구조를 따르는 프로그램 구조 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야를 도메인(domain)이라고 부른다. 객체지향 패러다임이 강력한 이유는 요구사항을 분석하는 초기 단계부터 프로그램을 구현하는 마지막 단계까지..
[Object] Chapter 01 - 객체, 설계 객체지향 패러다임을 설명하기 위해 추상적인 개념이나 이론을 앞세우지 않고, 가능하면 개발자인 우리가 가장 잘 이해할 수 있고 가장 능숙하게 다룰 수 있는 코드를 이용해 객체지향의 다양한 측면을 설명하려고 노력할 것이다. 소프트웨어 모듈은 세 가지 목적이 있다. 1. 실행 중에 제대로 동작 2. 변경을 위해 존재 3. 코드를 읽는 사람과 의사소통하는 것 (이해하기 쉬움) public class Theater { private var ticketSeller: TicketSeller init(ticketSeller: TicketSeller) { self.ticketSeller = ticketSeller } public func enter(audience: Audience) { if audience.bag.ha..