-
[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 (통합 테스트)기반으로 응용 애플리케이션 개발하기
- 레거시 애플리케이션에 트스트 코드 추가해 리팩토링하기
반응형'세미나' 카테고리의 다른 글
[OKKYCON: 2018] 이규원 - 당신들의 TDD가 실패하는 이유 (0) 2020.09.27 [OKKYCON: 2018] 정진욱 - 테스트하기 쉬운 코드로 개발하기 (0) 2020.09.06