Study

토끼책을 읽고 - 메시지를 믿을 수 있을까? (1)

Hyunec 2021. 3. 8. 21:51

이전 회사에서는 객체 지향적인 설계보다는 일단 되는 프로그램을 만드는 게 먼저였는데, 이번에 옮긴 회사에서는 객체 지향에 대한 투자를 많이 하는 것 같습니다. 이론의 부족함을 느꼈기에 이전에 읽으려다 만 토끼 책 (객체지향의 사실과 오해 - 조용호 저)을 읽어봤습니다.

 

역할, 책임 & 메시지, 협력

 

대부분 좋은 내용이고 이전에 구현한 어설픈 OOP, ORM에 대한 고민을 해결해줬지만, 하나가 계속 걸려서 이 글을 쓰게 되었습니다.

메시지를 믿을 수 있을까?

책에서 언급되지 않은 부분은 각색하고, 관련된 코드의 브랜치를 스텝별로 대괄호 표시했습니다. 
https://github.com/Hyune-c/Trust-Message/tree/master

[v1] 책에서는 판사-토끼-증인을 객체로서 책임과 메시지를 설명하고 있습니다.

메시지 (메소드) 를 통해 재판이 진행됩니다.

/*
  1. 전달자 - 토끼를 알고 있고
  2. 증언이 필요하지만 아직 증인이 누구인지 모른채로
  3. 재판을 진행할 책임이 있는

  판사
 */
public class Judge {

    ...
  // 1. 재판하라.
  public String doJudge() {
    // 2. 목격자를 불러오라.
    witness = communicator.findWitness();
    // 4. 증언하라.
    // 증언할 것이 있으면 유죄. 없으면 무죄.
    return (witness.doTestimony().isEmpty())
        ? "Innocence"
        : "Guilty";
  }
}

@Test
public void 정상_재판하라() {
  // given
  String testimony = "저는 보잘 것 없는 사람입니다.";
  // 1. 증언할 말이 있는 증인 - 모자장수
  Witness madHatter = new Witness(testimony);
  // 2. 모자장수를 알고 있는 전달자 - 토끼
  Communicator rabbit = new Communicator(madHatter);
  // 3. 토끼를 알고 있는 판사 - 왕
  Judge king = new Judge(rabbit);

  // when
  // 4. 재판하라!
  String judgeResult = king.doJudge();

  // then
  System.out.println(judgeResult);
}

[v2] 증언 방식이 바뀌었습니다!

판사는 증인에게 언제, 어디서 본 것인지 증언하라고 합니다. (메시지 인자)

다행히도 증인은 어제 광장의 일을 증언할 수 있었습니다.

public class Judge {
    ...
  // 1. 재판하라.
  public String doJudge() {
    // 2. 목격자를 불러오라.
    witness = communicator.findWitness();
    // 4. 증언하라.
    // 증언할 것이 있으면 유죄. 없으면 무죄.
    String testimonyKey = "어제왕국";
    String testimony = witness.doTestimony(testimonyKey);
    System.out.println(testimony);
    return (testimony.isEmpty())
        ? "Innocence"
        : "Guilty";
  }
}

@Test
  public void 정상_재판하라() {
    // given
    Map<String, String> testimonyMap = Map.of(
        "어제왕국", "엘리스를 보았어요!",
        "오늘광장", "저는 보잘 것 없는 사람입니다.");
    // 1. 증언할 말이 있는 증인 - 모자장수
    Witness madHatter = new Witness(testimonyMap);
    // 2. 모자장수를 알고 있는 전달자 - 토끼
    Communicator rabbit = new Communicator(madHatter);
    // 3. 토끼를 알고 있는 판사 - 왕
    Judge king = new Judge(rabbit);

    // when
    // 4. `어제왕국` 의 일을 재판하라!
    String judgeResult = king.doJudge();

    // then
    System.out.println(judgeResult);
  }

[v3] 이번에는 어제 분수의 일을 물었습니다.

불행히도 증인은 어제 분수의 일을 알지 못합니다! (NPE...?)

요지는 '메시지를 묻기 전에 (증언하라) 메시지를 처리할 수 있는지 (증언할 수 있는지)를 확인하는 것'입니다.

다행히도 책에서는 이미 답을 주었습니다.

메시지를 수신받은 객체는 우선 자신이 해당 메시지를 처리할 수 있는지 확인한다. 148p

메시지 인자를 수신받은 객체인 증인이 검증하도록 코드를 수정해, 증언이 없는 이 재판은 무죄입니다!

public class Witness{
...
public String doTestimony(String testimonyKey) {
return(testimonyMap.containsKey(testimonyKey))
        ? testimonyMap.get(testimonyKey)
        : "";
  }
}

이렇게 수신받은 객체에서 일을 하는 것으로 행복하게 끝났습니다.

 

하지만..

'Study' 카테고리의 다른 글

API Versioning 전략  (0) 2021.04.14
토끼책을 읽고 - 메시지를 믿을 수 있을까? (2)  (0) 2021.03.08
비동기 테스트 만들기  (0) 2021.02.25
Querydsl 로 가는 길  (0) 2020.12.02
ParameterizedTest 를 잘해보자  (0) 2020.08.21