이전 회사에서는 객체 지향적인 설계보다는 일단 되는 프로그램을 만드는 게 먼저였는데, 이번에 옮긴 회사에서는 객체 지향에 대한 투자를 많이 하는 것 같습니다. 이론의 부족함을 느꼈기에 이전에 읽으려다 만 토끼 책 (객체지향의 사실과 오해 - 조용호 저)을 읽어봤습니다.
역할, 책임 & 메시지, 협력
대부분 좋은 내용이고 이전에 구현한 어설픈 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 |