TDD, CleanCode, Refactoring 3주차 정리
- tdd 사이클이 익숙해질때 까지 반복적으로 연습해야 한다.
- 가장 자신있는 언어로 반복 연습하는것을 추천.
- 힘들고 지칠땐 주제를 바꿔서 해보는것이 좋다.
시작하기
- 요구사항 분석을 통한 기능 목록 작성
-
객체설계를 통해 어느 부분 부터 구현할 지 생각하는것이 우선이다.
- 기능목록
- 주제에 대해서 가장 일반적인 기능들을 다 적어보자.
- 점차 작은 단위의 기능들도 정의
- TDD로 구현할 기능 찾기
- 큰 부분을 작게 자르는 연습을 해야한다.
- 인풋과 아웃풋이 있는 케이스가 테스트 하기 쉽다.
-
메서드 하나에 모든 로직이 들어가 있으면 객체지향적인 구조보다 절차지향적 구조로 변질되게 된다.
- 리팩토링, 어디서 부터 시작할까 ?
- 첫밴쨰는 메소드 분리부터 시작. (Naming Rename도 해야한다.)
- 메소드가 한가지 일만 잘하도록 구현한다.
- 한가지 일만 하기 위해 메소드 라인을 제약하는것도 좋은 방법이다.
- 메소드가 한가지 일만 잘하도록 구현한다.
- Indent를 줄이자.
- Else 예약어를 쓰지 않는다.
- 클래스를 분리하자.
- 원시값과 문자열을 포장
- 일급 콜렉션을 사용한다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않기.
- 메소드 인자수를 제한한다. 2개까지만 허용한다.
- 3개는 고민을 많이 하고, 4개는 절대 안된다.
- 비슷한 속성을 가진 인자수를 클래스로 만들어 보자.
- 속성과 라이프 사이클이 동일하면 쉽게 판단할 수 있다.
- 첫밴쨰는 메소드 분리부터 시작. (Naming Rename도 해야한다.)
- private method를 분리해서 단위테스트 해야하는 것이 아닌가 ? 라는 의구심
- private method를 다른 클래스로 만들어 public으로 open하는게 더 나은 구조는 아닐까 생각해보자.
-
새로운 클래스가 생성될때 테스트부터 만들어 보자.
- 상속(is-a) 조합(has-a)
- 일급 collection을 구현할 때 접근 방법으로 상속과 조합 방법으로 구현 가능
- 객체의 중복(Lotto와 WinningLotto)를 제거 할 때 상속과 조합 방법으로 구현 가능
-
상속은 의도하지 않은 인터페이스가 외부에 노출될 수 있다.
반면 조합을 사용하면 외부에 오픈할 인터페이스를 정의할 수 있다. - 상속과 조합 중 어떤것이 좋을까 ?
- 상속 보단 객체 조합을 사용해라.
- 코드의 재사용성 측면에선 상속이 유리. 유연성 측면에선 조합이 유리.
- 변화에 빠르게 대응하는 것이 점점 더 중요, 현재는 재사용성 보다 유연성이 훨씬 더 중요하다.
- 확실하게 경험을 하는것이 좋다 !
- 생성자 대신 정적 팩토리 메소드 사용.
- 생성자의 수가 늘어날수록 클래스를 사용하기 위한 유연성은 높아진다.
- 가변객체보단 불변 객체를 사용해라.
- 불변 객체 만들기
- 객체의 상태를 변경하는 메소드를 제공하지 않는다.
- 클래스를 확장 할 수 없도록 한다. (Public final class)
- 모든 필드를 final로 선언한다.
- 내부에 collection이 있다면 collection도 불변인지 확인해야 한다.
- 모든 필드를 private으로 선언한다.
- immutable object 가 좋은것은 알겠는데, 인스턴스가 많이 생성되어 성능이 떨어지지 않을까 ?
- 캐싱을 적용해 인스턴스 생성을 최소화 할 수 있는 방법이 있는지 검토
- 캐싱은 일반적으로 Map(key - value) 형식을 가장 많이 사용된다.
- 캐싱을 적용해 인스턴스 생성을 최소화 할 수 있는 방법이 있는지 검토
성능외에도 유지보수하기 좋은 코드, 읽기 좋은 코드, 유연한 코드, 버그 발생 가능성이 낮은 코드 와 같이 다양한 측면을 고려하면서 프로그래밍 하는습관을 가지자
경험해야할 학습 목표 - 사다리 타기
1 |
|
경험할 객체 지향 생활 체조 원칙
- 한줄에 점 하나만 찍는다.
- Clean Code 가이드의 디미터 법칙을 지키는 것을 의미.
- 모든 엔티티는 작게
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- getter / setter / property를 쓰지 않는다.
함수형 프로그래밍
-
함수형 프로그래밍은 input과 output이 항상 존재 하기 때문에 test하기 쉽다.
- 클래스 기반 함수를 모으로 메소드 레벨에서 함수형 프로그래밍에 맞게 설계 ?
- 람다를 쓰는게 중요한게 아니고 변경 가능성이 높은 부분을 인터페이스로 추출 할 수 있는지가 중요하다.