전역 데이터는 아무곳에서나 변경될 수 있다는 문제가 있다.
어떤 코드로 인해 값이 바뀐 것인지 파악하기 어렵다.
클래스 변수도 비슷한 문제를 겪을 수 있다.
=> 변수 캡슐화하기 적용!
이것을 적용해서 접근을 제어하거나 어디서 사용하는지 파악하기 쉽게 만들수 있다.
허용되지않는 , 말도안되는 값이 들어오는것을 방지하기위해 우리는 validation 을 쓰는데 이런것들은 메서드로 감싸져있어야 적절한 사용이 가능하다
글로벌한 데이터 접근가능하게 하는것은 보통 상수 , final값들이다
메소드는 점진적으로 새로운 메서드로 변경가능하지만 , 데이터는 한번에 모두 변경해야한다.
- 데이터 사용범위가 global 일경우느 더더욱 메서드로 감싸주자(그만큼 수정을쉽게하면 전코드에 영향을 쉽게주니까)
- global 할수록 사이드이팩트가 심하다 -> 클래스로 감싸고 +Validation 추가
데이터 변경을 하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다.
변경할수 있는 데이터를 최대한 줄이도록 노력해야 한다.(그 변경으로 인한 사이드 이팩트 떄문)
- 변수 캡슐화 = 데이터를 변경할수 있는 메소드를 제한하고 관리
- 코드 정리하기 = 데이터를 변경하는 코드를 분리하고 피할수 있다.
- 변수 쪼개기 = 여러 데이터를 저장하는 변수를 나눌수 있다.
- 함수 추출하기 = 이것으로 데이터를 변경하는 코드로부터 사이드 이펙트가 없는 코드를 분리할수 있다.
- 질의 함수와 변경 함수 분리하기 = 클라가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API 개선 가능
- 파생 변수를 질의 함수로 바꾸기 = 계산해서 알아낼 수 있는 값에 적용한다.
- 여러 함수를 클래스로 묶기 = 변수가 사용되는 범위를 제한
- 참조를 값으로 바꾸기 = 데이터 일부를 변경하기보다는 데이터 전체를 교체
반복문 순회, 데이터 축척용 변수 말고 그밖에 재할당 되는 변수가 있다면 한번쯤 변수 쪼개기를 생각해보자
변수 하나당 하나의 책임을 지도록 만든다.
result는 값을 축척하는 용도로 사용해서 괜찮다.
반복문 순회, 데이터 축척용은 괜찮다.
"눈에 띌만한" 사이드 이펙트 없이 값을 조회할 수있는 메소드는 테스트 하기도 쉽고 메소드를 이동하기도 편하다
어떤 값을 리턴하는 함수 (조회) 는 사이드 이펙트가 없어야 한다.
캐시는 중요한 객체 상태 변화가 아니라 어떤 메소드의 사이드 이펙트로 캐시데이터를 변경하더라도 분리할 필요 없다.
조회함수와 변경함수(modifier) 를 구분하자
메서드 하나에서 result라는 값을 리턴하며 sendBill()이라는 메서드도 수행한다.
두개의 역활을 하는 메서드를 하나의 역활만 하도록 나누자 ( 조회와 변경을 나누자!)
세터가 제공된다는 것은 해당 필드가 변경될수 있다는 뜻이다.
안전한 데이터를 위해 세터를 없애고 생성자로만 값초기화를 가능 하도록 한다.
어떠한 계산식을 통해 알아낼수 있는 변수는 제거하는게 좋다 . 하지만 그 변수데이터가 불변이면 상관없다.
변수를 제거하고 그 계산식을 아예 함수에 넣어버리자.
계산식을 이용해 구하는 변수를 없애고 계산식을 직접 넣어주자.
변수를 줄임으로서 복잡도도 낮아지고 코드도 깔끔해진다.
소스 데이터가 변경될수 있는 경우에는 "여러 함수를 클래스로 묶기" 를 사용하는 것이 적절하다
소스 데이터가 변경되지 않는 경우에는 두 가지 방법 다 사용 가능하지만 변환 함수를 사용해서 불변 데이터의 필드로 생성해 두고 재사용할 수도 있다.
변환함수 :기존데이터를 받아서 새로운데이터 만들어주기
데이터가 불변이면 = 클래스로 묶거나 , 트랜스폼으로 묶거나
데이터가 변경되면 = 클래스로 묶기
클라 1. ,클라 2 도 역시나 공통적으로 자주쓰는 로직을 똑같이 한곳에서 가져올수있도록 고쳐준다.
부모클래스에서 그냥 상속으로 빼내도 되고, 이방법은 뭔가 부모 -> record 클래스 가는 느낌(?)
=> 변환함수를 통해 새로운 record를 만들고 그 recored 에 불변하는 필드(공통된 로직)를 추가함으로써 중복되던 메서드들이나 로직을 제거 할수있다.
= 변하는 값을 변하지 않는 값으로 바꾸기
- 객체는 크게 두가지로 볼수있다.
- 레퍼런스 객체: 가변
- Value 객체: 불변
Reference Object -> Value Object
- setter없애기
- 필드 private
- 오직 생성자로만 데이터 초기화 가능,
- hashCode,equals
- 이건 자바 11버전.
자바 14버전이후로는 그냥 record
객체를 참조해서 수정할떄코드들도 수정해준다.
setter를 사용할수 없으니 생성자를 통해 값 초기화
Record 간단 설명
- 불변
- 참조만 가능한 getter만 존재(메서드명은 필드이름이다)
- hashCode,Equals 구현되있음
- 코틀린의 Data class 와 매우 흡사