모던 자바 인 액션 Chapter 9. 리팩터링, 테스팅, 디버깅

doxxx·2022년 6월 20일
0

모던자바인액션

목록 보기
6/14
post-thumbnail

9.1 가독성과 유연성을 개선하는 리팩터링

익명 클래스를 람다 표현식으로 리팩터링하기

  • this와 super의 의미가 서로 다르다
    • 익명 클래스에서는 자신을, 람다에서는 람다를 감싸는 클래스를 가리킨다
  • 익명 클래스는 클래스의 변수(shadow vairable)을 갖지만 람다는 안된다.
  • 컨텍스트 오버로딩에 따른 모호함 발생
    • 인텔리제이가 해결해준다

람다 표현식을 메서드 참조로 리팩터링하기

람다 표현식을 별도의 메서드로 추출 후 인수로 전달,

도메인 클래스에 메서드로 작성을 통해 메서드 참조로 변환 가능하다

연습 많이 해라

명령형 데이터 처리를 스트림으로 리팩터링하기

킹론적으로 반복자를 이용한 컬렉션 처리 코드를 스트림으로 바꿔야한다

어려움

코드 유연성 개선

  • 동적 파리미터화
    • 함수형 인터페이스 적용
    • 조건부 연기 실행
      • 객체 상태가 클라이언트 코드로 노출되지 않는다
    • 실행 어라운드
      • 반복적으로 수행하는 코드가 있다면 람다로 변환

9.2 람다로 객체지향 디자인 패턴 리팩터링하기

전략 패턴

템플릿 메서드 패턴

옵저버 패턴

의무 체인 패턴

팩토리 패턴

9.3 람다 테스팅

제대로 작동하는 코드를 구현하기 위함

9.3.2 람다를 사용하는 메서드의 동작에 집중하라

assertj를 이용한 테스트 코드

class DebuggingTest {

    @Test
    void testMoveAllPointsRightBy() throws Exception {
        //given
        List<Point> points = Arrays.asList(new Point(5, 5), new Point(10, 5));
        List<Point> expectedPoints = Arrays.asList(new Point(15, 5), new Point(20, 5));
        //when
        List<Point> newPoints = Point.moveAllPointsRightBy(points, 10);

        //then
        assertThat(newPoints).usingRecursiveComparison().isEqualTo(expectedPoints);
    }
}
public class UsingRecursiveComparison {


    public static void main(String[] args) {

        Person sherlock = new Person("Sherlock", 1.80);
        sherlock.home.ownedSince = new Date(123);

        sherlock.home.address.street = "Baker Street";
        sherlock.home.address.number = 221;

        Person sherlock2 = new Person("Sherlock", 1.80);
        sherlock2.home.ownedSince = new Date(123);

        sherlock2.home.address.street = "Baker Street";
        sherlock2.home.address.number = 221;

        // assertion succeeds as the data of both objects are the same.
        assertThat(sherlock).usingRecursiveComparison().isEqualTo(sherlock2);

        // assertion fails because sherlock.equals(sherlock2) is false.
        assertThat(sherlock).isEqualTo(sherlock2);
    }

    static class Person {

        String name;
        double height;
        Home home = new Home();
    }

    static class Home {

        Address address = new Address();
        Date ownedSince;
    }

    static class Address {

        int number;
        String street;
    }
}

9.3.3 복잡한 람다를 개별 메서드로 분할하기

9.3.4 고차원 함수 테스팅

이곳은 잘 모르겠다..

0개의 댓글

관련 채용 정보