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
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
'개발 > Java&Kotlin' 카테고리의 다른 글
[Java] DTO, DAO, VO 차이 알아보기 (79) | 2023.10.10 |
---|---|
[Java] 오브젝트: 코드로 이해하는 객체지향 설계 (2) (151) | 2023.10.02 |
[Java] Record 알아보기 (57) | 2023.09.20 |
[Spring] Redirect, Forward 차이 (55) | 2023.09.18 |
[Java] 자바 JDK 21 버전 특징 (30) | 2023.08.31 |