ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OKKYCON: 2018] 박재성 - 의식적인 연습으로 TDD, 리팩토링 연습하기
    세미나 2020. 9. 13. 19:28
    반응형

    TDD는 무작정 연습하기보다 의식적으로 연습해야 한다.

     

    책에서 추천하는 의식적인 연습 원칙

    • 한 단계 발전하기 위해서는 컴포트 존(익숙하고 편안한 수준)을 벗어난 지점에서 연습을 한다.
    • 피드백을 받을 수 있는 환경(코드리뷰나 테스트 코드 등)을 만들어서 피드백에 따라 다음 단계를 연습해야 한다.
    • 한 번에 많은걸 연습하기보다 한 가지 특정 부분을 개선하는 것이 효과적인 연습이다.

     

    의식적인 TDD, 리팩토링 연습 과정

    1단계 - 단위 테스트 연습

    • 내가 사용하는 API (String 클래스의 split, substring 등)
    • Input과 Output이 명확한 클래스 메서드 (보통 Util 성격의 메서드)
    • 알고리즘

    2단계 - TDD 연습

    • 연습은 토이 프로젝트에 진행 ( 회사 프로젝트는 일정 압박에 연습이 잘 안됨 )
    • 외부 세상(웹 UI, DB)과 의존관계를 가지지 않은 요구사항으로 연습
    • 레드, 그린에 대한 연습을 충분히 진행하고 리팩토링 연습을 한다. 

    3단계 - 리팩토링 연습

    1. 메서드 분리

    • 한 메서드에 오직 한 단계의 들여 쓰기만 한다. ( 2단계 이상 들여 쓰기 X )
    • else를 쓰지 않는다. ( if문에서 return 시키면 아래 코드는 보지 않아도 됨 )
    • 메서드가 한 가지 일만 하도록 구현한다.
    • 꼭 필요하지 않은 로컬 변수를 제거 한다.
    • compose method 패턴 적용한다. ( 메서드의 의도가 잘 드러나도록 동등한 수준의 작업을 하는 여러 단계로 나눔 )
      ..... 잘 이해 안감

     

    2. 클래스 분리

     

    public class StringCalulator {
        public static int spliAndSum(String text) { ... }
        
        private static int[] toInts(String[] values) { ... }
        
        private static int toInt(String value) {
        	int number = Integer.parseInt(value);
            if (number < 0)
                throw new RumtimeException();
            return number;
        }
    • 모든 원시값과 문자열을 포장한다.
      원시 값인 toInt(String value)  메서드의 value를 클래스로 변환한다.
    public class Positive {
        private int number;
        
        public Positive(String value) {
        	int number = Integer.parseInt(value);
            if (number < 0)
          	    throw new RuntimeException();
            this.number = number;
        }
    }
    • value 값이 양수인 것을 보장하는 Positive 클래스를 파라미터 타입으로 활용
    • 일급 콜렉션을 쓴다.
    • 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

     

    4단계 - 토이 프로젝트 난이도 높이기

     

    TDD, 리팩토링 연습하기 좋은 프로그램 요구사항

    • 게임과 같이 요구사항이 명확한 프로그램으로 연습
    • 의존관계(UI, DB, 외부 API)가 없이 연습
    • 약간은 복잡한 로직이 있는 프로그램 (로또, 사다리 타기, 볼링 게임 점수판, 체스 게임, 지뢰 찾기 게임)

     

    5단계 - 의존관계(UI, DB, 외부 API) 추가를 통한 난이도 높이기

     

     

    한 단계 더 나아간 연습하기

    • 컴파일 에러를 최소화하면서 리팩토링 하기
    • ATDD (통합 테스트)기반으로 응용 애플리케이션 개발하기
    • 레거시 애플리케이션에 트스트 코드 추가해 리팩토링하기

     

    반응형
Designed by Tistory.