개발/Java&Kotlin

[Java] 오브젝트: 코드로 이해하는 객체지향 설계 (1)

devhooney 2023. 9. 22. 08:16
728x90

조영호님의 오브젝트 읽고...

자세한 내용은 도서 구입 후 확인...

 

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

 

- 초대장 클래스

public class Invitation {
	private LocalDateTime when;
}

 

- 티켓 클래스

public class Ticker {
	private Long fee;
    
    public Long getFee() {
    	return fee;
    }
}

 

- 관람객 가방 클래스

public class Bag {
	private Long amount;
    private Invitation invitation;
    private Ticket ticket;
    
	public boolean hasInvitation() {
    	return invitation != null;
    }

	public boolean hasTicket() {
    	return ticket != null;
    }
    
    public void minusAmount() {
    	this.amount -= amount;
    }
    
    public void plusAmount() {
    	this.amount += amount;
    }
    
    public Bag(long amount) {
    	this(null, amount);
    }
    
    public Bag(Invitation invitaion, long amount) {
        this.invitation = invitation;
        this.amount = amount;
    }

}

 

- 관람객 클래스

public class Audience {
	private Bag bag;
    
    ...생성자...
    
    ...Getter...
}

 

- 매표소 클래스

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));
    }
    
    public Ticket getTicket() {
    	return tickets.remove(0);
    }
    
    public void minusAmount(){...}
    public void plisAmount(){...}
}

 

- 판매원 클래스

public class TicketSeller {
	private TicketOffice ticketOffice;
    ...생성자...
    ...Getter...
}

 

- 극장 클래스

public class Theater {
	private 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);
        }
    
    }
}

 

 

 

728x90

 

 

 

2. 코드 개선

(1) 자율성 높이기

TicketSeller가 직접 Bag과 TicketOffice에 접근하는 모든 코드를 TicketSeller 내부로 이동

- 판매원 클래스

public class TicketSeller {
	private TicketOffice ticketOffice;
    ...생성자...
    ...Getter...
    
    
    public void sellTo(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);
        }
    
    }
    
}

 

 

- 극장 클래스

public class Theater {
	private TicketSeller ticketSeller;
    
    ...생성자...
    
    public void enter(Audience audience) {
    	ticketSeller.sellTo(audience);
    
    }
}

 

이것이 캡슐화

 

 

가방은 관람객만 접근 가능해야 하기 때문에 수정

- 관람객 클래스

public class Audience {
	private Bag bag;
    
    ...생성자...
    
    ...Getter...
    
    
    public Long buy(Ticket ticket) {
     	if (bag.hasInvitation()) {
            bag.setTicket(ticket);
            return 0L;
        } else {
        	bag.setTicket(ticket);
            bag.minusAmount(ticket.getFee());
            return ticket.getFee();
        }
    }
    
}

 

 

- 판매원 클래스

public class TicketSeller {
	private TicketOffice ticketOffice;
    ...생성자...
    ...Getter...
    
    
    public void sellTo(Audience audience) {
    	ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
    
    }
    
}

 

 

 

 

- 출처

https://link.coupang.com/a/baoA2S

 

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

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90