무엇이 문제인가
Robert C. Martin 은 소프트웨어 모듈이 가져야하는 세 가지 기능에 관해 설명합니다.
(1) 먼저 잘 동작해야하고 (2) 변경하기 쉬워야하며 (3) 코드를 누구나 잘 읽을 수 있어야 한다.
잘 동작하는 코드는 누구나 작성할 수 있지만,
(2) 내가 아닌 사람이 내 코드를 잘 읽을 수 있게 하거나 (3) 코드를 손쉽게 수정하게 하는 것은 좋은 설계를 따르게 됩니다.
극장 클래스가 관람객을 입장시키는 enter 메서드를 다시 살펴보면
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