TIL-20171031

2017.10.31 (화) 오늘의 T.I.L.

오늘은 근무가 없어 야근했다.

  • JDBC 라이브러리 구현과제를 거의 완료하다.

    • find() 메소드를 오브젝트에 구애받지 않게(Parameter를 Object… objects로 받게) 구현하는 과제를 제외하곤 모두 완료했다.
    • 처음 인터페이스를 분리하고 각 구현 클래스를 만들었다가, 다시 기능별로 한 클래스로 합치는 경험을 해 봤다.
    • 익명 클래스, 추상 클래스, 람다식, 함수형 인터페이스 등 자바 코드를 깨끗하게 만들 수 있는 모든 기술을 동원해야 하는 예제였다.
    • 내일 온라인으로 포비에게 코드 리뷰를 받고 개선점을 찾아볼 생각이다.
  • TDD 특강을 듣다.

    • 판교에서도 포비에게 몇 번 들은 적 있던 내용들이라 크게 새롭지는 않았다.
    • TDD가 주는 장점은 말로 다 표현하지 못할 정도로 많다. 그러나 요즘 일상에서 TDD가 점점 흐려지고 있어 걱정이다.
    • 결과보다 과정에 집중하는 개발 문화를 만들 때 비로소 진짜 TDD를 실천하고 있다. 나는 지금 그렇게 하고 있나? 하물며 학습 단계에서도 그런 자세를 갖는 것이 어려운데 현업에 나가 일정에 대한 압박을 받는 상황에서, 얼마나 TDD를 할 수 있을까?
    • TDD에 대한 기술을 많이 배우지만 이것은 기술이 아닌 철학의 문제임을 다시 한 번 느끼다.

이어 구현과제로 문자열 계산기를 TDD로 만들어 봤다. 그다지 어려운 구현이 아니라서 금방 했다.
다만 구현 방식에서 약간 차이가 있었다. 포비는 람다식을 기반으로 구현한 것 같았는데 나는 Operator라는 enum을 구현하고, 각 enum 객체가 추상 메소드를 구현할 수 있도록 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

public class Calculator {

public enum Operator{
SUM("+"){
@Override
public int compute(int a, int b){
return a + b;
};
}, DIVIDE("/"){
@Override
public int compute(int a, int b){
return a / b;
};
}, MULTIPLY("*"){
@Override
public int compute(int a, int b){
return a * b;
}
}, SUBTRACT("-"){
@Override
public int compute(int a, int b){
return a - b;
}
};

private String operator;

private Operator(String operator){
this.operator = operator;
}

public boolean equals(String s){
return s.equals(this.operator);
}

public abstract int compute(int a, int b);
}



public int calculate(String numbers){
String[] values = numbers.split(" ");
return compute(values[0], values[2], findOperator(values[1]));
}


private int compute(String a, String b, Operator o){
return o.compute(Integer.parseInt(a), Integer.parseInt(b));
}


private Operator findOperator(String s){
List<Operator> operator = Arrays.asList(Operator.values()).stream().filter(o -> o.equals(s)).collect(Collectors.toList());
if(operator.size() > 1){
throw new MultipleOperatorsException(MultipleOperatorsException.STANDARD_OPERATOR_ERROR_MSG);
}
return operator.get(0);
}
}

enum이 추상 메소드를 갖도록 하는 것은 처음 해 보는 구현이라 여기에 옮겨 본다.