SWE

Advanced TDD - Transformation Priority Premise

링크

메모

The Transformation List

영상 41분부터 설명

  • Null
  • Null to Constant
  • Constant to Variable
    • ex) return new ArrayList();를 변수로 변경하는 것
  • 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) 요런거!
  • Variable to Array
    • ex) 스택 예제에서 int element라는 가장 최신의 값을 int[] elements로 변경
  • Array to Container
    • ex) 스택 예제에서 int[] elements의 타입을 List<Integer>로 변환하는 것
  • If to While
    • ex) if(n % 2 == 0)while(n % 2 == 0)으로 변환하는 것
  • Recurse
  • Iterate
  • Assign : 이미 존재하는 변수의 값을 변경하고자 할 때 사용
  • Add Case : 이미 분리된 흐름이 존재하지만, 더 분리하고 싶을 경우 사용
    • ex) switch 문장에 새로운 case 절을 추가하는 등.. (확 이해되지는 않는듯!… isStrike? isBall? isPoul?)
    • -> 다형성과 원만한 합의

Transformation

  • 리팩터링에 반대되는 개념임
    • Refactoring : 행위의 변경 없이 구조를 변경(주목할만한 행위의 변경이 없다는 의미)
    • Transformation : 구조의 변경 없이 행위를 변경(주목할만한 구조의 변경이 없다는 의미)
  • 좋은 알고리즘을 얻기 위한 우선 순위가 존재함(위 리스트 참고)
  • (명석님) 큰 구조의 변화없이 실패하는 테스트를 성공하도록 만드는 것으로 이해하는 것이 편함
  • GREEN 단계에 속함
  • 방향성 :
    • 테스트를 성공시키는데 사용
    • 구조 변경없이 행위를 일반화(더 많은 케이스를 커버 가능한)

결론

  • 테스트를 성공시킬 2가지 이상의 방법이 있다면 우선순위가 높은 방법을 적용하기
  • 이게 모든 경우에 적용되는지 확신할 수 없어서.. Premise(전제?)라고 한다. -> Transformation Priority Premise(TPP)