이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 8장에서는 의존성의 개념을 자세히 설명하고 결합도를 느슨하게 유지할 수 있는 다양한 설계 방법들을 설명합니다. 잘 설계된 객체지향 애플리케이션은 작고 응집도 높은 객체들로 구성된다. 작고 응집도 높은 객체란 책임의 초점이 명확하고 한 가지 일만 잘하는 객체를 의미한다. 협력을 위해서는 의존성이 필요하지만 과도한 의존성은 애플리케이션을 수정하기 어렵게 만든다. 객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서도 변경을 방해하는 의존성은 제거하는데 있다. 이런 관점에서 객체지향 설계란 의존성을 관리하는 것이고, 객체가 변화를 받아들일 수 있게 의존성을 정리하는 기술이라고 할 수 있습니다. 의존성 이해하기 변경과 의존성 어떤 객체가 협력하기 위해 ..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 7장에서는 추상화의 한 가지 방법인 분해의 역사를 다룹니다. 한 번에 다뤄야 하는 정보의 수를 줄이기 위해 본질적인 정보만 남기고 불필요한 세부 사항을 걸러내면 문제를 단순화할 수 있을 것이다. 이처럼 불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업을 추상화라고 부른다. 사람들은 한 번에 해결하기 어려운 커다란 문제에 맞닥뜨릴 경우 해결 가능한 작은 문제로 나누는 경향이 있다. 이처럼 큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해(decomposition)라고 부른다. 프로시저 추상화와 데이터 추상화 현대적인 프로그래밍 언어를 특징 짓는 중요한 두 가지 추상화 메커니즘 프로시저 추상화(procedure abstraction..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 6장에서는 훌륭한 퍼블릭 인터페이스를 작성하기 위해 따라야 하는 설계 원칙을 소개합니다. 협력과 메시지 훌륭한 객체지향 코드를 얻기 위해서는 클래스가 아니라 객체를 지향해야 한다. 좀 더 정확하게 말해서 협력 안에서 객체가 수행하는 책임에 초점을 맞춰야 한다. 여기서 중요한 것은 책임이 객체가 수신할 수 있는 메시지의 기반이 된다는 것이다. 객체가 수신하는 메시지들이 객체의 퍼블릭 인터페이스를 구성한다. 훌륭한 퍼블릭 인터페이스를 얻기 위해서는 책임 주도 설계 방법을 따르는 것만으로는 부족하다. 유연하고 재사용 가능한 퍼블릭 인터페이스를 만드는 데 도움이 되는 설계 원칙과 기법을 익히고 적용해야 한다. 클라이언트-서버 모델 메시지는 객체 사이의 협력을 가..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 5장에서는 GRASP라고 부르는 책임 할당 패턴을 설명합니다. 올바른 책임을 할당하기 위해서는 다양한 관점에서 설계를 평가할 수 있어야 한다. 책임 주도 설계를 향해 데이터 중심의 설계에서 책임 중심의 설계로 전환하기 위해서는 다음의 두 가지 원칙을 따라야 한다. 데이터보다 행동을 먼저 결정하라 협력이라는 문맥 안에서 책임을 결정하라 데이터보다 행동을 먼저 결정해라 책임 중심의 설계에서는 "이 객체가 수행해야 하는 책임은 무엇인가"를 결정한 후에 "이 책임을 수행하는 데 필요한 데이터는 무엇인가"를 결정한다. 다시 말해 책임 중심의 설계에서는 객체의 행동, 즉 책임을 먼저 결정한 후에 객체의 상태를 결정한다는 것이다. 협력이라는 문맥 안에서 책임을 결정하..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 4장에서는 절차적 프로그래밍 방식으로 영화 예매 시스템을 다시 구현해 보고, 이렇게 구현된 코드의 품질이 나쁜 이유를 설명합니다. 객체지향 설계의 핵심은 역할, 책임, 협력이다. 협력은 애플리케이션의 기능을 구현하기 위해 메시지를 주고받는 객체들 사이의 상호작용이다. 책임은 객체가 다른 객체와 협력하기 위해 수행하는 행동이고 역할은 대체 가능한 책임의 집합이다. 데이터 중심의 영화 예매 시스템 객체지향 설계에서는 두 가지 방식으로 시스템을 객체로 분할할 수 있다. 상태를 분할의 중심축으로 삼는 방법 객체는 자신이 포함하고 있는 데이터를 조작하는 데 필요한 오퍼레이션을 정의한다.(상태에 초첨) 책임을 분할의 중심축으로 삼는 방법 다른 객체가 요청할 수 있는..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 3장에서는 2장에서 구현한 영화 예매 시스템을 역할, 책임, 협력의 관점에서 설명하며, 이 요소들을 이용해 시스템을 설계하는 책임 주도 설계 방법에 관해서도 소개합니다. 협력 영화 예매 시스템 돌아보기 객체들은 요청의 흐름을 따라 자신에게 분배된 로직을 실행하면서 애플리케이션의 전체 기능을 완성한다. 객체지향 패러다임의 관점에서 핵심은 3가지로 표현할 수 있다. 협력(collaboration) : 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용 책임(responsibility) : 객체가 협력에 참여하기 위해 수행하는 로직 역할(role) : 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행 협력 협력은 객체지향 세계에서 기능을 구현..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 2장에서는 책 전반에 걸쳐 반복적으로 참고하게 될 영화 예매 시스템의 도메인을 설명하고 객체지향적으로 작성한 코드를 소개합니다. 객체지향 프로그래밍을 향해 협력, 객체, 클래스 객체지향은 객체를 지향하는 것이다. 진정한 객체지향 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있다. 프로그래밍하는 동안 두 가지에 집중해야 한다. 첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화한 것이다. 따라서 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지를 먼저 결정해야 한다. 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 1장에서는 이켓 판매 시스템이라는 간단한 도메인을 예로 들어 책의 전체적인 주제를 함축해서 전달합니다. 티켓 판매 어플리케이션 여러분은 소극장의 홍보도 겸할 겸 관람객들의 발길이 이어지도록 작은 이벤트를 기획하기로 했다. 이벤트의 내용은 간단한데 추첨을 통해 선정된 관람객에게 공연을 무료로 관람할 수 있는 초대장을 발송하는 것이다. 관람객이 가지고 올 수 있는 소지품은 초대장, 현금, 티켓 세 가지뿐이다. 관람객은 소지품을 보관할 용도로 가방을 들고 올 수 있다고 가정하자. 소극장을 구현하는 클래스는 Theater다. Therater 클래스가 관함객을 맞이할 수 있도록 enter 메서드를 구현하자. public class Theater { private ..