무엇이 문제인가

Robert C. Martin 은 소프트웨어 모듈이 가져야하는 세 가지 기능에 관해 설명합니다.

(1) 먼저 잘 동작해야하고 (2) 변경하기 쉬워야하며 (3) 코드를 누구나 잘 읽을 수 있어야 한다.

잘 동작하는 코드는 누구나 작성할 수 있지만,

(2) 내가 아닌 사람이 내 코드를 잘 읽을 수 있게 하거나 (3) 코드를 손쉽게 수정하게 하는 것은 좋은 설계를 따르게 됩니다.

극장 클래스가 관람객을 입장시키는 enter 메서드를 다시 살펴보면

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

Theater 클래스는 관람객(audience) 의 가방을 마음대로 확인하고 있습니다. (초대장 확인, 현금 차감)

판매원(ticketSeller) 의 매표소도 마찬가지입니다. 관람객과 판매원은 수동적인 존재로 보여집니다.

이해하기 쉬운 코드는 예상과 크게 다르지 않은 코드를 말합니다.

관람객은 가방을 직접 열어 초대장을 제시합니다. 또 현금을 꺼내 티켓을 판매원에게서 직접 구매합니다.

판매원은 관람객에게서 현금을 받아 티켓을 건네고 직접 매표소에 현금을 보관합니다.

또 다른 이유로 Theater 클래스는 너무 많은 세부사항을 알고 있습니다.

(1) 관람객이 가방을 가지고 있어야한다는 사실

  • audience.getBag()

(2) 그리고 가방에는 티켓과 현금이 있어야하고

  • audience.getBag().setTicket()

  • audience.getBag().minusAmount()

(3) 판매원이 매표소에서 티켓을 판매하며

  • ticketSeller.getTicketOffice().getTicket()

(4) 매표소에서는 현금과 티켓이 있다는 사실

  • ticketSeller.getTicketOffice().getTicket()

  • ticketSeller.getTicketOffice().plusAmount()

만약, 관람객과 판매원의 세부사항이 바뀌면 Theater 메서드의 로직도 함께 변경되어야합니다.

변경에 취약한 코드는 객체 간 의존성이 강하게 결합되어 있습니다.

의존하지 않는 객체를 구현하는 것이 객체 지향 설계의 목적은 아닙니다.

객체들이 적절하게 의존하면서 협력하는 프로그램을 만드는 것이 목적입니다.

어떻게 개선할 수 있을까요?

Last updated