본문 바로가기

BackEnd

오브젝트 1장 객체, 설계 내용 정리

반응형

 

오브젝트: 코드로 이해하는 객체지향 설계 | 위키북스 (wikibook.co.kr)

 

오브젝트: 코드로 이해하는 객체지향 설계

역할, 책임, 협력을 향해 객체지향적으로 프로그래밍하라! 객체지향으로 향하는 첫걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두 번째 걸음은 객체를

wikibook.co.kr

객체 내부 데이터는 객체 스스로 처리한다.

  • 캡슐화란 자신의 데이터 수정의 책임을 객체 스스로 갖는것
  • 객체지향 세계의 객체는 의인화된 객체이다.
  • 책임은 행동(협력 문맥 => 메세지에 응답할 책임)에 의해 정해진다.

앞으로 자주 나오는 그림 설명

클래스 다이어그램
객체간 메세지 흐름와 데이터 흐름을 보여주는 커뮤니케이션 다이어그램. 링크는 해당 클래스를 필드로 갖고 있는 쪽에서.
모듈, 네임스페이스, 패키지를 나타내는 패키지 다이어그램

프로그래밍 패러다임은 보완재다.

객체지향이 적합하지 않은 상황에서는 언제라도 다른 패러다임을 적용할 수 있는 시야를 갈고 닦아라.

절차지향의 문제점을 객체지향으로 해결하기.

초기 설계의 문제점 : 객체가 자유롭지 못하다.
책임이 중앙집중된 절차적 프로그래밍

package org.eternity.theater.step01;

public class Theater {
    private TicketSeller ticketSeller;

    public Theater(TicketSeller ticketSeller) {
        this.ticketSeller = ticketSeller;
    }

    public void enter(Audience audience) {
        if (audience.getBag().hasInvitation()) {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            audience.getBag().setTicket(ticket);
        } else {
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            audience.getBag().minusAmount(ticket.getFee());
            ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
            audience.getBag().setTicket(ticket);
        }
    }
}

다른 객체의 상태를 극장이 맘대로 바꾸고 있다.

해결 방안 : 자신의 데이터는 자신이 처리한다.

객체들에 자율성을 부여한다.

  • 극장이 관객과 매표원에 대해 너무 많이 알고 있음
    • 클래스가 데이터 역할만 하여 절차지향적인 코드를 만듬
    • Theater의 enter 메서드는 프로세스이며 Bag, Aucience, TicketSeller, TicketOffice는 데이터임
    • 데이터와 프로세스를 별도의 모듈에 위치시키는 방식을 절차적 프로그래밍이라 한다.
  • 관람객과 판매원을 자율적인 존재로 만든다.
    • 관람객이 스스로 가방 안의 현금과 초대장을 처리
    • 판매원이 스스로 매표소의 티켓과 판매 요금을 다룸

책임이 분산된 객체지향 프로그래밍

데이터와 데이터를 사용하는 프로세스가 동일한 모듈 내부에 위치하도록 프로그래밍 하는 방식을 객체 지향 프로그래밍이라 한다.

응집도 : 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임.

결합도 : 객체 사이의 의존도. 결합도가 크면 함께 변경될 가능성이 커져 유지보수가 어려워짐.

캡슐화 : 객체 내부의 세부적인 사항을 감추는 것 (변경하기 쉬운 객체를 만듬)

  • 내부 접근을 막아 객체와 객체 사이의 결합도를 줄일 수 있음
  • 인터페이스만 호출하고 내부 상태를 직접 변경할 수 없도록 함

TicketOffice마저 자율적인 객체가 될 수 있지만, 의존성이 하나 더 생겼다.

public class TicketOffice {
    private Long amount;
    private List<Ticket> tickets = new ArrayList<>();

    public TicketOffice(Long amount, Ticket... tickets) {
        this.amount = amount;
        this.tickets.addAll(Arrays.asList(tickets));
    }

    // 아래 코드는 책에서 설명한 것처럼 트레이드오프 후에 원래의 step02의 구현으로 복구해야 합니다.
    public void sellTicketTo(Audience audience) {
        plusAmount(audience.buy(getTicket()));
    }

    private Ticket getTicket() {
        return tickets.remove(0);
    }

    private void plusAmount(Long amount) {
        this.amount += amount;
    }
}

설계는 트레이드 오프다.

설계는 코드의 배치다.

객체지향의 세계에서 화내고 웃는 가방과 매표소를 만나도 놀라지 마라.

반응형