티스토리 뷰

Java

[Java] Object 도서 정리(1)

joeylee 2020. 11. 23. 00:59

1. 티켓 판매 어플리케이션 구현

/**
 * 극장을 표현
 * 판매원을 가지고 있음
 */
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);
        }
    }
}

enter메소드는 극장에서 가방안에 초대장이 있는지 확인하고

초대장이 있다면 판매원에게 받은 티켓을 관람객의 가방에 넣어주고

초대장이 없다면 티켓을 판매합니다

잘 동작하는 코드지만 해당 프로그램은 문제가 있습니다

 

2. 무엇이 문제인가?

  1. Audience과 TicketSeller이 Theater의 통제를 받는 수동적인 존재입니다
  2. 하나의 클래스에서 너무 많은 세부사항을 다루고 있습니다
    enter 메소드를 이해하기 위해 Audience 가 Bag를 가지고 Bag안에 현금과 티켓이 있고 TicketSeller가 TicketOffice에서 티켓을 판매하고 등 모든 사실을 알고 있어야합니다
  3. Audience와 TicketSeller를 변경할 경우 Theater를 함께 변경해야합니다
    의존성이 있다는것은 어떤 객체가 변경될때 다른 객체도 변경될 수 있습니다

따라서 설계의 목표는 최소한의 의존성만 유지하고 불필요한 의존성을 제거하여 결합도를 낮춰 변경에 용이한 설계를 해아합니다

 

 

3. 설계 개선하기

Theater가 Audience와 TicketSeller에 관해 너무 세세한 부분까지 알지못하도록 정보를 차단

Audience와 TicketSeller를 자율적인 존재로 만든다

첫번째로 ticketOffice에 접근하는 코드를 ticketOffice를 포함하는 TicketSeller로 이동

public void enter(Audience audience) {
    ticketSeller.setllTo(audience);
}
/**
 * 판매원을 구현
 * 자신이 일하는 매표소를 알고있음
 */
public class TicketSeller {
    private TicketOffice ticketOffice;

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

 

외부에서는 ticketOffice을 외부에서 드러내지 않음으로서 캡슐화를 통해 결합도를 낮췄습니다

두번째로 bag에 접근하는 코드를 bag를 포함하는 Audience로 이동

public void sellTo(Audience audience) {
    ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
}
/**
 * 관람객을 표현
 * 소지품을 보관하기위한 Bag 소지
 */
public class Audience {

    private Bag bag;

    public Long buy(Ticket ticket) {
        if(bag.hasInvitation()) {
            bag.setTicket(ticket);
            return 0L;
        }
        else {
            bag.setTicket(ticket);
            bag.minusAmount(ticket.getFee());
            return ticket.getFee();
        }
    }
}

 

외부에서는 bag를 외부에서 드러내지 않음으로서 캡슐화를 통해 결합도를 낮췄습니다

세번째로 bag를 접근하는 로직을 bag 안으로 이동

/**
 * 가방을 표현
 * 현금과 초대장, 티켓을 가지고 있음
 */
public class Bag {
    private Long amount;
    private Invitation invitation;
    private Ticket ticket;

        public Long hold(Ticket ticket) {
        if(hasInvitation()) {
            setTicket(ticket);
            return 0L;
        }
        else {
            setTicket(ticket);
            minusAmount(ticket.getFee());
            return ticket.getFee();
        }
    }
}
public class Audience {

    public Long buy(Ticket ticket) { 
        return bag.hold(ticket);
    }
}

 

bag 내부상태에 접근하는 모든 로직을 bag안으로 캡슐화하여 결합도를 낮췄습니다

네번째로 ticketSeller의 sellTo 메서드의 내부코드를 이동

public class TicketOffice {

    public void sellToTicketTo(Audience audience) {
        plusAmount(audience.buy(getTicket()));
    }
}
public class TicketSeller {

    public void sellTo(Audience audience) {
        ticketOffice.sellToTicketTo(audience);
    }
}

 

ticketOffice 내부상태에 접근하는 모든 로직을 ticketOffice안으로 캡슐화하여 결합도를 낮췄습니다

하지만 기존에 없었던 Audience와의 의존성이 추가되었다

이런 경우 TicketOffice의 자율성과 Audience 에 대한 결합도에 중에 선택을 하여야한다

 

 

결론

설계를 어렵게 만드는것은 의존성입니다

의존성을 제거함으로써 객체 사이의 결합도를 낮춰야합니다(캡슐화를 사용)

⇒ 그 결과, 자율성을 높고 응집도 높은 객체 탄생

변경 가능하고 이해하기 쉬운 코드를 만들자

'Java' 카테고리의 다른 글

[Java] JVM 구조  (0) 2020.11.27
[Java] Object 도서 정리(2)  (0) 2020.11.23
[Java] 리액티브(reactive) 프로그래밍이란?  (0) 2020.11.23
[Java] 제이미터(jmeter)란?  (0) 2020.11.23
[Java] 람다(lambda)함수란?  (0) 2020.11.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함