오브젝트 1장 객체, 설계 (2) 무엇이 문제인가

YeongJun Son·2023년 4월 5일
0

오브젝트

목록 보기
2/2

들어가며

글과 관련해

  • 코드 내에서 쓰이는 주석은 제가 추가로 단 것입니다.
  • 모든 코드는 해당 책에서 참고했습니다.
  • '나가며' 파트는 저 스스로 던져보는 질문입니다.

선요약 및 정리

  • 지난 시간에는 티켓 판매라는 일에 관련된 여러 클래스를 구현해보았습니다. 이번 시간에는 지난 시간에 짠 코드의 문제점을 살펴봅니다.
  • 1장 (2)에서 중심 내용은 1장 (1)에서 짠 코드가 변경 용이성과 의사소통이라는 목적을 만족하지 못한다는 것입니다. 이는 객체의 의존성과도 크게 연관됩니다.
  • 제가 보기에, 객체에 적절한 의존성을 부여하는 방법으로 그 자신이 포함하는 '인스턴스 변수'에 관련된 행위는 내부에서 처리하는 것입니다. 다른 객체는 해당 객체에게 명령하거나, 권한을 주거나, 요청을 하는 식으로 소통할 수 있다고 생각합니다.

Ch 01. 객체, 설계 (2)

02. 무엇이 문제인가

로버트 마틴, "클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 방법"

  • 모듈: 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소
  • 모든 모듈은 (1) 제대로 실행돼야 하고, (2) 변경이 용이해야 하며, (3) 이해하기 쉬워야 한다
    → (1) 앞서 작성한 프로그램은 필요 기능을 오류 없이 수행
    → ~(2), ~(3) 그러나 변경 용이성과 의사소통이라는 목적은 만족 X

예상을 빗나가는 코드

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에 접근
  	}
  }
}   
  • 관람객과 판매원이 소극장의 통제를 받는 수동적인 존재로 그려짐
    → 소극장이 허락 없이 티켓과 현금에 접근 가능
  • 또한 코드를 이해하기 위해서 여러 세부적인 내용(Bag과 을 한꺼번에 기억하고 있어야함
  • 가장 심각한 문제: Audience와 TicketSeller를 변경할 경우 Theater도 함께 변경해야 함

변경에 취약한 코드

  • 객체 사이의 의존성(dependency)와 관련된 문제
    → 어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체도 함께 변경될 수 있다
    → 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거
  • 결합도(coupling)이 높다: 객체 사이의 의존성이 과하다
  • 현재 구현된 코드에서는 Theater가 다른 클래스에 과도하게 의존하고 있다
    → 관람객이 가방이 없거나, 결제를 신용카드로 해야하는 경우?

나가며

더 나아가기

  • 의존성이란 정확히 무엇이고, 어느 정도의 의존성이 가장 적절한가? (물론 case by case겠지만)

    1. 그렇다면 위 Theater은 어떤 정도까지 변화해야 하는가?
      → Theater가 관람객과 매표원-매표소를 '직접' 들여다 보는 대신, 관련된 명령을 내리거나 접근 권한을 주면 어떨까?
      (실제로도 소극장은 오히려 규칙/명령을 내리거나 권한을 부여하는 존재가 아닌가?)

    2. Audience 역시 단순히 '가방'을 들고 있는 것에서 그치지 않고, 나름의 합당한 행동을 해야하지 않을까?
      → 예를 들면 '티켓'을 구매하거나 요청하며, 돈을 지불하는 것은 관객의 역할이다.
      → 매표원 역시 '티켓'을 '현금'으로 교환하고, 그러한 '현금'을 매표소에 넣거나 '티켓'을 매표소에서 빼오는 역할을 해야할 것이다.

  • 의존성에 대한 논의들 찾아보기
    → 일단 위 두 질문에서, 나름대로 정리해보자면 객체는 '자신이 할 수 있는 만큼'은 자신 내에서 처리해야 한다.

profile
제가 좋아하는 것은 도가 아니라 기입니다

0개의 댓글