리팩토링21. 파생 변수를 질의 함수로 바꾸기
Replace Derived Variable with Query
- 변경할 수 있는 데이터를 최대한 줄이도록 노력해야 한다. (가급적이면 변경 될 수 있는 변수 줄이기)
- 계산해서 알아낼 수 있는 변수는 제거할 수 있다.
- 계산에 필요한 데이터가 변하지 않는 값이라면, 계산의 결과에 해당하는 데이터 역시 불변 데이터기 때문에 해당 변수는 그대로 유지할 수 있다.
- Ex) discountedTotal : 파생 데이터 (총액 – 할인액)
리팩토링22. 여러 함수를 변환 함수로 묶기
Combine Functions into Transform
- 관련있는 여러 파생 변수를 만들어내는 함수가 여러곳에서 만들어지고 사용된다면 그러한 파생 변수를 “변환 함수(transform function)”를 통해 한 곳으로 모아둘 수 있다.
- 소스 데이터가 변경될 수 있는 경우에는(Setter를 가지고 있는 경우) “여러 함수를 클래스로 묶기 (Combine Functions into Class)”를 사용하는 것이 적절하다.
- 소스 데이터가 변경되지 않는 경우에는 두 가지 방법을 모두 사용할 수 있지만, 변환 함수를 사용해서 불변 데이터의 필드로 생성해 두고 재사용할 수도 있다.
- Ex) Reading Object (record 자료구조 – immutable)
- EnrichReading 메소드(변환함수) – immutable한 새로운 타입의 레코드 리턴, 새로운 타입에 baseCharge 등 계산이 필요한 필드를 생성하여, 변환함수를 통해 새로운 타입의 레코드 생성.
- 변환함수 호출 시 새로운 타입의 레코드를 리턴하여 Client마다 baseCharge 등을 계산해야하는 번거로움 줄일 수 있음 (중복 제거)
리팩토링 23. 참조를 값으로 바꾸기
Change Reference to Value
- Immutable values와 완전히 반대로 하는 리팩토링
- 레퍼런스 (Reference) 객체 vs 값 (Value) 객체
- 레퍼런스 객체 – 얼마든지 데이터 변경 가능한 객체, 레퍼런스 객체 사용 중인 모든 곳에서 변경 사항이 전파됨
- 값 객체는 객체가 가진 필드의 값으로 동일성을 확인 (setter 비제공, equals 와 hashCode 재정의 필요 : 동일성 확인을 위해. -> record 자료구조 활용 권장. 자바17 이전 버전에서는 intellij에서 자바빈즈 템플릿, 빌더 템플릿, 레코드 템플릿 선택 가능)
- 값 객체는 변하지 않음(불변객체)
- 어떤 객체의 변경 내역을 다른 곳으로 전파시키고 싶다면 레퍼런스, 아니면 값 객체 사용
'Programming > Java' 카테고리의 다른 글
[리팩토링] 냄새17,리팩토링37 (0) | 2023.05.21 |
---|---|
[리팩토링] 냄새16,리팩토링36 (1) | 2023.05.21 |
[이펙티브자바] 아이템30. 이왕이면 제네릭 메서드로 만들라 (0) | 2023.04.08 |
[이펙티브자바] 아이템29. 이왕이면 제네릭 타입으로 만들라 (0) | 2023.04.08 |
[이펙티브자바] 아이템25. 톱 레벨 클래스는 한 파일에 하나만 담으라. (0) | 2023.04.02 |