링크
- 영상 : 클린 코더스 강의 18. Transformation Priority Premise
- 저장소 : https://github.com/le2sky/java-tdd-tpp
메모
The Transformation List
영상 41분부터 설명
- Null
- Null to Constant
- Constant to Variable
- ex)
return new ArrayList();를 변수로 변경하는 것
- ex)
- Add Computation : 하나 혹은 둘의 계산식을 추가하는 변환(심지어 변수도 추가)
예시 before )
ArrayList<Integer> factors = new ArrayList();
if(n > 1) {
factors.add(n);
}
return factors;
예시 after )
ArrayList<Integer> factors = new ArrayList();
if(n > 1) {
if(n % 2 == 0) {
factors.add(2);
n /= 2;
}
factors.add(n);
}
return factors;
- Split Flow : if 문장과 관계가 있음
- ex) 갯수가 2개인 리스트에 대한 테스트를 성공시키기 위해서
if(list.size() == 2)요런거!
- ex) 갯수가 2개인 리스트에 대한 테스트를 성공시키기 위해서
- Variable to Array
- ex) 스택 예제에서
int element라는 가장 최신의 값을int[] elements로 변경
- ex) 스택 예제에서
- Array to Container
- ex) 스택 예제에서
int[] elements의 타입을List<Integer>로 변환하는 것
- ex) 스택 예제에서
- If to While
- ex)
if(n % 2 == 0)을while(n % 2 == 0)으로 변환하는 것
- ex)
- Recurse
- Iterate
- Assign : 이미 존재하는 변수의 값을 변경하고자 할 때 사용
- Add Case : 이미 분리된 흐름이 존재하지만, 더 분리하고 싶을 경우 사용
- ex) switch 문장에 새로운 case 절을 추가하는 등.. (확 이해되지는 않는듯!… isStrike? isBall? isPoul?)
- -> 다형성과 원만한 합의
Transformation
- 리팩터링에 반대되는 개념임
- Refactoring : 행위의 변경 없이 구조를 변경(주목할만한 행위의 변경이 없다는 의미)
- Transformation : 구조의 변경 없이 행위를 변경(주목할만한 구조의 변경이 없다는 의미)
- 좋은 알고리즘을 얻기 위한 우선 순위가 존재함(위 리스트 참고)
- (명석님) 큰 구조의 변화없이 실패하는 테스트를 성공하도록 만드는 것으로 이해하는 것이 편함
- GREEN 단계에 속함
- 방향성 :
- 테스트를 성공시키는데 사용
- 구조 변경없이 행위를 일반화(더 많은 케이스를 커버 가능한)
결론
- 테스트를 성공시킬 2가지 이상의 방법이 있다면 우선순위가 높은 방법을 적용하기
- 이게 모든 경우에 적용되는지 확신할 수 없어서.. Premise(전제?)라고 한다. -> Transformation Priority Premise(TPP)