티스토리 뷰
가변데이터
- 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다.
- 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다.
- 이와 관련된 리팩토링으로는
변수 쪼개기 (Split Variable)
을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다.질의 함수와 변경 함수 분리하기 (Separate Query from Modifier)
를 적용해서 클라이언트가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API를 개선할 수 있다.- 가능하다면
세터 제거하기 (Remove Setting Method)
를 적용한다. - 계산해서 알아낼 수 있는 값에는
파생 변수를 질의 함수로 바꾸기 (Replace Derived Variable with Query)
를 적용할 수 있다. - 변수가 사용되는 범위를 제한하려면
여러 함수를 클래스로 묶기 (Combine Functions into Class)
또는여러 함수를 변환 함수로 묶기 (Combine Functions into Transform)
을 적용할 수 있다. 참조를 값으로 바꾸기 (Change Reference to Value)
를 적용해서 데이터 일부를 변경하기 보다는 데이터 전체를 교체할 수 있다.변수 캡슐화하기 (Encapsulate Variable)
를 적용해 데이터를 변경할 수 있는 메소드를 제한하고 관리할 수 있다.코드 정리하기 (Slide Statements)
를 사용해 데이터를 변경하는 코드를 분리하고 피할 수 있다.함수 추출하기 (Extract Function)
으로 데이터를 변경하는 코드로부터 사이드 이팩트가 없는 코드를 분리할 수 있다.
변수 쪼개기 (Split Variable)
- 어떤 변수가 여러번 재할당 되어도 적절한 경우
- 반복문에서 순회하는데 사용하는 변수 또는 인덱스
- 값을 축적시키는데 사용하는 변수
- 그밖에 경우에 재할당 되는 변수가 있다면 해당 변수는 여러 용도로 사용되는 것이며 변수를 분리해야 더 이해하기 좋은 코드를 만들 수 있다.
- 변수 하나 당 하나의 책임(Responsibility)을 지도록 만든다.
- 상수를 활용하자. (자바스크립트의 const, 자바의 final)
질의 함수와 변경 함수 분리하기 (Separate Query from Modifier)
눈에 띌만한
사이드 이팩트 없이 값을 조회할 수 있는 메소드는 테스트 하기도 쉽고, 메소 드를 이동하기도 편하다.- 명령-조회 분리 (command-query separation) 규칙
- 어떤 값을 리턴하는 함수는 사이드 이팩트가 없어야 한다.
눈에 띌만한 (observable) 사이드 이팩트
- 가령, 캐시는 중요한 객체 상태 변화는 아니다. 따라서 어떤 메소드 호출로 인해, 캐시 데 이터를 변경하더라도 분리할 필요는 없다.
세터 제거하기 (Remove Setting Method)
- 세터를 제공한다는 것은 해당 필드가 변경될 수 있다는 것을 뜻한다.
- 객체 생성시 처음 설정된 값이 변경될 필요가 없다면 해당 값을 설정할 수 있는 생성자를 만들고 세터를 제거해서 변경될 수 있는 가능성을 제거해야 한다.
파생 변수를 질의 함수로 바꾸기 (Replace Derived Variable with Query)
- 변경할 수 있는 데이터를 최대한 줄이도록 노력해야 한다.
- 계산해서 알아낼 수 있는 변수는 제거할 수 있다.
- 계산 자체가 데이터의 의미를 잘 표현하는 경우도 있다.
- 해당 변수가 어디선가 잘못된 값으로 수정될 수 있는 가능성을 제거할 수 있다.
- 계산에 필요한 데이터가 변하지 않는 값이라면, 계산의 결과에 해당하는 데이터 역시 불변 데이터기 때문에 해당 변수는 그대로 유지할 수 있다.
여러 함수를 변환 함수로 묶기 (Combine Functions into Transform)
- 관련있는 여러 파생 변수를 만들어내는 함수가 여러곳에서 만들어지고 사용된다면 그러한 파생 변수를
변환 함수 (transform function)
를 통해 한 곳으로 모아둘 수 있다. - 소스 데이터가 변경될 수 있는 경우에는
여러 함수를 클래스로 묶기 (Combine Functions into Class)
를 사용하는 것이 적절하다. - 소스 데이터가 변경되지 않는 경우에는 두 가지 방법을 모두 사용할 수 있지만, 변환 함수 를 사용해서 불변 데이터의 필드로 생성해 두고 재사용할 수도 있다.
참조를 값으로 바꾸기 (Change Reference to Value)
- 레퍼런스 (Reference) 객체 vs 값 (Value) 객체
Objects that are equal due to the value of their properties, in this case their x and y coordinates, are called value objects.
- 값 객체는 객체가 가진 필드의 값으로 동일성을 확인한다.
- 값 객체는 변하지 않는다.
- 어떤 객체의 변경 내역을 다른 곳으로 전파시키고 싶다면 레퍼런스, 아니라면 값 객체를 사용한다.
Reference
백기선. 코딩으로 학습하는 리팩토링. 인프런. https://www.inflearn.com/course/%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81/dashboard
'Study' 카테고리의 다른 글
[Refactoring] 산탄총 수술 (0) | 2022.03.18 |
---|---|
[Refactoring] 뒤엉킨 변경 (0) | 2022.02.27 |
[Refactoring] 전역 데이터 (0) | 2022.02.25 |
[Refactoring] 긴 매개변수 목록 (0) | 2022.02.24 |
[Refactoring] 긴 함수 (0) | 2022.02.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자료구조
- 파이썬
- Real MySQL
- 스프링부트
- 노마드코더
- mysql 8.0
- MySQL
- 코테
- Algorithm
- 백준
- 알고리즘
- 인프런
- 그리디
- 스프링 부트
- Spring
- 김영한
- 정렬
- 데이터베이스
- 코틀린
- kotlin
- 노마드
- 구현
- 북클럽
- 릿코드
- 리팩토링
- spring boot
- leetcode
- 문자열
- 스프링
- webflux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함