#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

  • 전환시 주의

    1. this와 super의 의미는 익명 클래스와 람다식에서 다르고, 익명 클래스 안에서 변수는 enclosing하는 클래스의 변수를 섀도잉할 수 있다.

    2. 오버로딩 면에서 결과 코드가 모호해질 수 있습니다.

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를 제거 가능

  • 다룰 디자인 패턴 (객체지향에서 주로 사용하는)

    • Strategyarrow-up-right: 클래스 동작이나 알고리즘은 런타임에 변경 가능

    • Templatearrow-up-right method: 추상 클래스는 메서드를 실행하기 위해 템플릿(정의들)을 노출

    • Observerarrow-up-right: 변경이 있으면 옵저버에게 전파

    • Chain of responsibilityarrow-up-right: 리시버 체인을 생성을 생서하고, 송신자와 수신자를 decouple 시켜줄 수 있다. 일반적으로 각 수신기는 다른 수신기에 대한 참조를 가져, 한 객체가 요청을 처리할 수 없으면, 다음 수신자에게 전달하는 방식으로 처리한다.

    • Factoryarrow-up-right: 부모 인터페이스를 사용해, 클라이언트에게 안의 (구현체나) 로직 노출 없이, 객체 생성 가능

  • 디자인 패턴이 가진 문제에 대한 솔루션을 제공 가능하다.

9.3 람다 테스팅

9.4 Debugging

  • 테스팅에서 람다식에 문제가 있을 경우, 어떻게 디버깅을 해야할까?

    • 보통 먼저 스택 트레이스, 로깅 확인하지만, 람다식이나 스트림은 안 먹힌다...

아래 예제 요약: 람다나 메서드 참조 사용시, 람다를 사용하거나 외부 메서드를 사용하는 메서드 참조는 디버깅이 안된다. 다만, 메서드 참조에서, 동일 클래스 내에 메서드 호출이면 디버깅 가능해진다.

  • 스트림의 파이프라인 연산을 디버깅하고 싶다면?

  • 파이프라인 연산 디버깅 = peek()

Last updated