이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 4장에서는 절차적 프로그래밍 방식으로 영화 예매 시스템을 다시 구현해 보고, 이렇게 구현된 코드의 품질이 나쁜 이유를 설명합니다. 객체지향 설계의 핵심은 역할, 책임, 협력이다. 협력은 애플리케이션의 기능을 구현하기 위해 메시지를 주고받는 객체들 사이의 상호작용이다. 책임은 객체가 다른 객체와 협력하기 위해 수행하는 행동이고 역할은 대체 가능한 책임의 집합이다. 데이터 중심의 영화 예매 시스템 객체지향 설계에서는 두 가지 방식으로 시스템을 객체로 분할할 수 있다. 상태를 분할의 중심축으로 삼는 방법 객체는 자신이 포함하고 있는 데이터를 조작하는 데 필요한 오퍼레이션을 정의한다.(상태에 초첨) 책임을 분할의 중심축으로 삼는 방법 다른 객체가 요청할 수 있는..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 3장에서는 2장에서 구현한 영화 예매 시스템을 역할, 책임, 협력의 관점에서 설명하며, 이 요소들을 이용해 시스템을 설계하는 책임 주도 설계 방법에 관해서도 소개합니다. 협력 영화 예매 시스템 돌아보기 객체들은 요청의 흐름을 따라 자신에게 분배된 로직을 실행하면서 애플리케이션의 전체 기능을 완성한다. 객체지향 패러다임의 관점에서 핵심은 3가지로 표현할 수 있다. 협력(collaboration) : 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용 책임(responsibility) : 객체가 협력에 참여하기 위해 수행하는 로직 역할(role) : 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행 협력 협력은 객체지향 세계에서 기능을 구현..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 2장에서는 책 전반에 걸쳐 반복적으로 참고하게 될 영화 예매 시스템의 도메인을 설명하고 객체지향적으로 작성한 코드를 소개합니다. 객체지향 프로그래밍을 향해 협력, 객체, 클래스 객체지향은 객체를 지향하는 것이다. 진정한 객체지향 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있다. 프로그래밍하는 동안 두 가지에 집중해야 한다. 첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화한 것이다. 따라서 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지를 먼저 결정해야 한다. 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게..
이 글은 오브젝트라는 책을 읽고 정리한 글입니다. 1장에서는 이켓 판매 시스템이라는 간단한 도메인을 예로 들어 책의 전체적인 주제를 함축해서 전달합니다. 티켓 판매 어플리케이션 여러분은 소극장의 홍보도 겸할 겸 관람객들의 발길이 이어지도록 작은 이벤트를 기획하기로 했다. 이벤트의 내용은 간단한데 추첨을 통해 선정된 관람객에게 공연을 무료로 관람할 수 있는 초대장을 발송하는 것이다. 관람객이 가지고 올 수 있는 소지품은 초대장, 현금, 티켓 세 가지뿐이다. 관람객은 소지품을 보관할 용도로 가방을 들고 올 수 있다고 가정하자. 소극장을 구현하는 클래스는 Theater다. Therater 클래스가 관함객을 맞이할 수 있도록 enter 메서드를 구현하자. public class Theater { private ..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 추상화 기법 추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용하는 인지 수단이다. 추상화 기법의 종류 분류와 인스턴스화 분류는 객체의 구체적인 세부사항을 숨기고 인스턴스 간에 공유하는 공통적인 특성을 기반으로 범주를 형성하는 과정이다. 분류의 역은 범주로부터 객체를 생성하는 인스턴스화 과정이다. 예시: 승용차, 버스, 트럭을 자동차로 분류 일반화와 특수화 일반화는 범주 사이의 차이를 숨기고 범주 간에 공유하는 공통적인 특성을 강조한다. 일반화의 역을 특수화라고 한다. 예시: 자동차와 자전거를 운송 수단으로 일반화 집합과 분해 집합은 부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정을 가리킨다. ..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 7장에서는 구현코드가 등장합니다. 코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다. - 에릭 에반스(Eric Evans) 마틴 파울러는 객체지향 설계 안에 존재하는 세가지 상호 연관된 관점에 관해 설명한다. 개념 관점 (Conceptual Perspective) 도메인 안에 존재하는 개념과 개념들 사이의 관계 표현한다. 사용자가 도메인을 바라보는 관점 반영한다. 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심이다. 명세 관점 (Specification Perspective) 도메인이 아니라 실제로 소프트웨어 안에서 살아 숨쉬는 객체들의 책임에 초점을 맞추게 된다. (객체의 인터페이스를 바라..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 6장에서는 객체지향이 구조와 기능이라는 두 가지 관점을 어떻게 조화시키는지에 관해 설명합니다. 유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. - 헤라클레이토스(Heraclitus of Ephesus) 객체지향은 자주 변경되는 기능이 아니라 안정적인 구조를 기반으로 시스템을 구조화한다. 자주 변경되는 기능이 아니라 안정적인 구조를 기반으로 시스템을 분할하는 객체지향적인 접근법은 역할, 책임, 협력을 기반으로 시스템의 기능을 구현하는 책임-주도 설계의 본질을 이해하는 데도 도움이 될 것이다. 자주 변경되는 기능이 아니라 안정적인 구조를 따라 역할, 책임, 협력을 구성하라. 기능 설계 대 구조 설계 모든 소프트웨어 제품의 설계에는 두..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 5장에서는 훌륭한 메시지가 훌륭한 객체지향 설계의 기반이라는 사실을 강조합니다. 의도는 "메시징"이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려 있다. - 앨런 케이(Kay 1998) 훌륭한 객체지향의 세계는 명확하게 정의된 역할과 책임을 지닌 객체들이 상호 협력하는 세계다. 자율적인 책임 설계의 품질을 좌우하는 책임 객체지향 공동체를 구성하는 기본 단위는 자율적인 객체다. 객체들은 애플리케이션의 기능을 구현하기 위해 협력하고, 협력 과정에서 각자 맡은 바 책임을 다하기 위해 자율적으로 판단하고 행동한다. 자율성: 자기 스스로의 원칙에 따라 어떤 일을 하..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 4장에서는 객체지향 설계의 가장 중요한 재료인 역할, 책입, 협력에 관해 설명합니다. 우리 모두를 합친 것보다 더 현명한 사람은 없다. - 켄 블랜차드(Ken Blanchard) 훌륭한 객체지향 설계란 겉모습은 아름답지만 협력자들을 무시하는 오만한 객체를 창조하는 것이 아니라, 조화를 이루며 적극적으로 상호작용하는 협력적인 객체를 창조하는 것이다. 협력 요청하고 응답하며 협력하는 사람들 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작된다. 협력은 다수의 요청과 응답으로 구성되며, 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다. 누가 파이를 훔쳤지? 객체지향의 세계는 동일한 목적을 달성하기 위해 협력하는 객체들의 공..
이 글은 객체지향의 사실과 오해라는 책을 읽고 정리한 글입니다. 3장에서는 소프트웨어 개발에서 가장 중요한 개념인 추상화와 마주치게 될 것 입니다. 일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다. - 키스 데블린(Keith Devlin) 추상화를 통한 복잡성의 극복 추상화 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 복잡성을 다루기 위해 추상화는 다음의 두 차원에서 이뤄진다. - 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는..