#09장 리팩토링, 테스팅, 디버깅
Raoul-Gabriel Urma 저, 우정은 역 「Modern Java in Action, 2019」를 읽고 정리하였습니다.
9장 요약
람다식은 가독성있고 유연하다.
익명 클래스에서 람다로 바꿀시 this, 변수 섀도 등 주의해야 한다.
메서드 참조 사용하면 람다보다 가독성 증가한다.
람다식은 흔한 객체지향 디자인 패턴에서 발생하는 boilerplate를 제거가능하다.
복잡한 람다식은 일반 메서드로 구현할 수 있다.
람다식을 사용하면 스택 트레이스를 이해하기 어려워진다.
파이프라인 연산시 디버깅은 peek를 사용한다.
이장에서 다룰 내용
Refactoring code to use lambda expressions
Appreciating the impact of lambda expressions on object-oriented design patterns
Testing lambda expressions
Debugging code that uses lambda expressions and the Streams API
9.1 Refactoring for improved readability and flexibility
Readability
readability를 위해 보여줄 리팩토링 순서
anonymous classes to lambda expressions
lambda expressions to method references
imperative-style data processing to streams
anonymous classes to lambda expressions
전환시 주의
this와 super의 의미는 익명 클래스와 람다식에서 다르고, 익명 클래스 안에서 변수는 enclosing하는 클래스의 변수를 섀도잉할 수 있다.
오버로딩 면에서 결과 코드가 모호해질 수 있습니다.
lambda expressions to method references
imperative data processing to Streams
imperative data를 Streams으로 바꾸는 것은 어려운 작업이다. (break, continue 같은 control-flow를 고려해야기 때문에)
Flexibility
behavior parameterization
functional interfaces 없이는 람다를 사용할 수 없다.
2가지 코드 패턴
conditional deferred execution 패턴
execute around 패턴
이외에, 람다와 간결히 사용될 수 있는 strategy and template-method design patterns 도 다룰 예정
9.2 람다로 객체지향 디자인 패턴 리팩토링 하기
람다 사용으로, 흔한 객체 지향 패턴에서 boilerplate code를 제거 가능
다룰 디자인 패턴 (객체지향에서 주로 사용하는)
Strategy: 클래스 동작이나 알고리즘은 런타임에 변경 가능
Template method: 추상 클래스는 메서드를 실행하기 위해 템플릿(정의들)을 노출
Observer: 변경이 있으면 옵저버에게 전파
Chain of responsibility: 리시버 체인을 생성을 생서하고, 송신자와 수신자를 decouple 시켜줄 수 있다. 일반적으로 각 수신기는 다른 수신기에 대한 참조를 가져, 한 객체가 요청을 처리할 수 없으면, 다음 수신자에게 전달하는 방식으로 처리한다.
Factory: 부모 인터페이스를 사용해, 클라이언트에게 안의 (구현체나) 로직 노출 없이, 객체 생성 가능
디자인 패턴이 가진 문제에 대한 솔루션을 제공 가능하다.
9.3 람다 테스팅
9.4 Debugging
테스팅에서 람다식에 문제가 있을 경우, 어떻게 디버깅을 해야할까?
보통 먼저 스택 트레이스, 로깅 확인하지만, 람다식이나 스트림은 안 먹힌다...
아래 예제 요약: 람다나 메서드 참조 사용시, 람다를 사용하거나 외부 메서드를 사용하는 메서드 참조는 디버깅이 안된다. 다만, 메서드 참조에서, 동일 클래스 내에 메서드 호출이면 디버깅 가능해진다.
스트림의 파이프라인 연산을 디버깅하고 싶다면?
파이프라인 연산 디버깅 = peek()
Last updated