kok202
[2019.02.09] 클린 코드 (TDD, 클래스)

2019. 2. 9. 15:10[공부] 독서/클린 코드

TDD


테스트 코드 = 함수 이름 앞에 test를 붙여서 명명


TDD 법칙

1. 실패하는 단위 테스트를 찾을 때까지 코드를 작성하지 않는다.

2. 컴파일은 성공하면서 실행이 실패하는 단위테스트를 작성한다.

3. 현재 실패를 통과할 정도로의 코드를 작성한다.


테스트를 실제 코드 작성전에 작성해야하는 이유는 실제 코드가 테스트 불가능하게 설계될 위험이 있기 때문이다.


테스트 코드도 깨끗해야한다.

테스트 코드들이 중복이 심하다면 이를 엮을 방법을 생각해라.

예를들어 Build-operate-check 패턴을 적용하면 중복을 없앨 수 있다.

마찬가지 Template-Method 패턴을 적용하면 중복을 없앨 수 있다.


테스트당 assert 문은 하나만 넣어라.


테스트 작성법

public void test~(){

given~();   // = build

when~();   // = operate

then~();    // = check = assert 문을 이용한 조건 체크

}


FISRT 법칙

Fast : 테스트는 빨라야한다.

Independent : 테스트는 하나만 테스트 해야하고 독립적이여야한다.

Repeatable : 테스트는 어떤환경에서도 반복 가능해야한다.

Self-Validating : 테스트의 결과는 성공/실패여야한다. 주저리 주저리 길어선 안된다.

Timely : 테스트는 실제 코드 구현 직전에 작성되야한다.


※ JUnit - @Test





클래스


클래스는 맡은 책임이 작아야한다.


클래스이름이 길어진다면 역할이 여러개가 주어진게 아닌지 의심해봐라


응집도 : 클래스 내의 메소드들의 (사용하는 멤버 변수의 갯수 / 전체 멤버 변수의 갯수) 평균

응집도가 높을수록 좋다. 

응집도가 높아지도록 클래스를 쪼개라


결합도

A 클래스는 C라는 콘크리트 클래스에 접근하고 싶다.

1. A 클래스가 C 클래스에 바로 접근한다면 이는 결합도가 높다.

2. A 클래스가 C 클래스의 추상화된 인터페이스 B 에 접근한다면 결합도가 낮아진다.

결합도는 낮을 수록 좋다.


※ DIP : 클래스 설계 SOLID 원칙중 'D'

Spring에서 말하는 Dependency Incjection

클래스는 상세한 구현이 아니라 추상화에 의존해야한다.