글과 관련해
선요약 및 정리
로버트 마틴, "클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 방법"
예상을 빗나가는 코드
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);
// 허락 없이 audience의 ticket 에 접근
} else {
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmount(ticket.getFee());
// 허락 없이 audience의 amount에 접근
ticketSeller.getTicketOffice.plusAmount(ticket.getFee());
// 허락 없이 ticketSeller에 접근해 ticketOffice 내 현금 접근
audience.getBag().setTicket(ticket);
// 허락 없이 audience의 ticket에 접근
}
}
}
변경에 취약한 코드
더 나아가기
의존성이란 정확히 무엇이고, 어느 정도의 의존성이 가장 적절한가? (물론 case by case겠지만)
그렇다면 위 Theater은 어떤 정도까지 변화해야 하는가?
→ Theater가 관람객과 매표원-매표소를 '직접' 들여다 보는 대신, 관련된 명령을 내리거나 접근 권한을 주면 어떨까?
(실제로도 소극장은 오히려 규칙/명령을 내리거나 권한을 부여하는 존재가 아닌가?)
Audience 역시 단순히 '가방'을 들고 있는 것에서 그치지 않고, 나름의 합당한 행동을 해야하지 않을까?
→ 예를 들면 '티켓'을 구매하거나 요청하며, 돈을 지불하는 것은 관객의 역할이다.
→ 매표원 역시 '티켓'을 '현금'으로 교환하고, 그러한 '현금'을 매표소에 넣거나 '티켓'을 매표소에서 빼오는 역할을 해야할 것이다.
의존성에 대한 논의들 찾아보기
→ 일단 위 두 질문에서, 나름대로 정리해보자면 객체는 '자신이 할 수 있는 만큼'은 자신 내에서 처리해야 한다.