리팩토링, 테스팅, 디버깅
가독성과 유연성을 개선하는 리팩토링
코드 가독성 개선
- 코드의 장황함을 줄여서 쉽게 이해할 수 있는 코드를 구현할 수 있다.
- 메서드 레퍼런스와 스트림 API를 이용해서 코드의 의도(코드가 무엇을 수행하려는 것인지)를 쉽게 표현할 수 있다.
익명 클래스를 람다 표현식으로 리팩토링하기
- 람다 표현식을 이용해서 간결하고, 가독성이 좋은 코드를 구현할 수 있다. 하지만 익명 클래스를 람다 표현식으로 모두 변환할 수 있는 것은 아니다.
- 익명 클래스에서 사용한 this와 super는 람다 표현식에서 다른 의미를 갖는다. 익명 클래스에서 this는 익명 클래스 자신을 가리키지만 람다에서 this는 람다를 감싸는 클래스를 가리킨다.
- 익명 클래스는 감싸고 있는 클래스의 변수를 가릴 수 있다. 하지만 다음 코드에서 보여주는 것처럼 람다 표현식으로는 변수를 가릴 수 없다.
int a = 10;
Runnable r1 = () -> {
int a = 2; // 컴파일 에러
System.out.println(a);
}
Runnable r2 = new Runnable () {
public void run () {
int a = 2; // 모든 것이 잘 동작
System.out.println(a);
}
}
람다 표현식을 메서드 레퍼런스로 리팩토링하기
- 람다 표현식은 쉽게 전달할 수 있는 짧은 코드다. 하지만 람다 표현식 대신 메서드 레퍼런스를 이용하면 가독성을 높일 수 있다. 메서드 레퍼런스의 메서드명으로 코드의 의도를 명확하게 알릴 수 있기 때문이다.
명령형 데이터 처리를 스트림으로 리팩토링하기
- 이론적으로는 반복자를 이용한 기존의 모든 컬렉션 처리 코드를 스트림 API로 바꿔야 한다. 스트림 API는 데이터 처리 파이프라인의 의도를 더 명확하게 보여준다.
List<String> dishNames = new ArrayList<>();
for (Dish dish : menu) {
if (dish.getCalories() > 300) {
dishNames.add(dish.getName()) ;
}
}
menu.parallelStream().
.filter(d -> d.getCalories() > 300)
.map(Dist::getName)
.collect(toList());
코드 유연성 개선
- 다양한 람다를 전달해서 다양한 동작을 표현할 수 있다. 따라서 변화하는 요구사항에 대응할 수 있는 코드르 구현할 수 있다.
람다로 객체지향 디자인 패턴 리팩토링하기
전략
- 전략 패턴은 세부분으로 구성
- 알고리즘을 나타내는 인터페이스(Strategy)
- 다양한 알고리즘을 나타내는 한 개 이상의 인터페이스 구현
- 전략 객체를 사용하는 한 개 이상의 클라이언트
http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzaVp6Y183dHFHNk0
전략