마틴파울러 리팩터링 2판 정주행 스터디 - 실전편
9.1 변수 쪼개기 Split Variable
변수에 대입이 두 번 이상 이뤄진다면 여러 가지 역할을 수행한다는 신호다.
역할이 둘 이상인 변수가 있다면 쪼개야 한다. 예외는 없다. 역할 하나당 변수 하나다. 여러 용도로 쓰인 변수는 코드를 읽는 이에게 커다란 혼란을 주기 때문이다.
9.2 필드 이름 바꾸기 Rename Field
데이터 구조가 중요한 만큼 반드시 깔끔하게 관리해야 한다.
개발을 진행할수록 데이터를 더 잘 이해하게 된다. 따라서 그 깊어진 이해를 프로그램에 반드시 반영해야 한다.
한 함수 안에서만 쓰였다면 캡슐화할 필요없이 그저 원하는 속성들의 이름을 바꿔주는 것으로 끝이다.
9.3 파생 변수를 질의 함수로 바꾸기 Replace Derived Variable with Query
가변 데이터의 유효범위를 가능한 한 좁혀야 한다.
값을 쉽게 계산해낼 수 있는 변수들을 모두 제거하는 것은 효과가 좋은 방법 중 하나이다. 계산 과정을 보여주는 코드 자체가 데이터의 의미를 더 분명히 드러내는 경우도 자주 있으며 변경된 값을 깜빡하고 결과 변수에 반영하지 않는 실수를 막아준다.
여기에는 합당한 예외가 있다. 피연산자 데이터가 불변이라면 계산 결과도 일정하므로 역시 불변으로 만들 수 있다. 그래서 새로운 데이터 구조를 생성하는 변형 연산이라면 비록 계산 코드로 대체할 수 있더라도 그대로 두는 것도 좋다.
소스 데이터가 불변이거나 파생 데이터를 잠시 쓰고 버릴거라면 어느 방식을 써도 상관없다.
9.4 참조를 값으로 바꾸기 Change Reference to Value
필드를 값으로 다룬다면 내부 객체의 클래스를 수정하여 값 객체(Value Object)로 만들 수 있다. 불변 데이터 값은 프로그램 외부로 건네줘도 나중에 그 값이 나 몰래 바뀌어서 내부에 영향을 줄까 염려하지 않아도 된다.
값 객체의 이런 특성 때문에 이번 리팩터링을 적용하면 안되는 상황도 있다. 특정 객체를 여러 객체에서 공유하고자 한다면, 그래서 공유 객체의 값을 변경했을 때 이를 관련 객체 모두에 알려줘야 한다면 공유 객체를 참조로 다뤄야 한다.
값 객체로 인정받으려면 동치성을 값 기반으로 평가해야 한다. 자바스크립트는 참조 기반 동치성을 값 기반 동치성으로 대체하는 일과 관련하여 언어나 핵심 라이브러리 차원에서 지원해주는 게 없다. (대부분의 객체 지향 언어는 값 기반 동치성 비교를 할 수 있도록 오버라이드 가능한 동치성 검사 수단을 기본으로 제공한다.)
9.5 값을 참조로 바꾸기 Change Value to Reference
논리적으로 같은 데이터를 물리적으로 복제해 사용할 때 가장 크게 문제되는 상황은 그 데이터를 갱신해야 할 때다. 모든 복제본을 찾아서 빠짐없이 갱신해야 하며, 하나라도 놓치면 데이터 일관성이 깨져버린다. 이런 상황이라면 복제된 데이터들을 모두 참조로 바꿔주는 게 좋다. 데이터가 하나면 갱신된 내용이 곧바로 반영되기 때문이다.
값을 참조로 바꾸면 엔티티 하나당 객체도 단 하나만 존재하게 되는데, 이런 객체들을 한데 모아놓고 클라이언트들의 접근을 관리해주는 일종이 저장소가 필요해진다. 각 엔티티를 표현하는 객체를 한 번만 만들고, 객체가 필요한 곳에서는 모두 이 저장소로부터 얻어쓰는 방식이 된다.
9.6 매직 리터럴 바꾸기 Replace Magic Literal
매직 리터럴(Magic Literal)이란 소스 코드에 등장하는 일반적인 리터럴 값을 말한다. 코드를 읽는 사람이 이 값의 의미를 모른다면 숫자 자체로는 의미를 명확히 알려주지 못하므로 매직 리터럴이라고 할 수 있다. 의미를 알고 있다고 해도 결국 각자의 머리에서 해석해낸 것일 뿐이라서, 이보다는 코드 자체가 뜻을 분명하게 드러내는게 좋다. 상수를 정의하고 숫자 대신 상수를 사용하도록 바꾸면 될 것이다.
상수를 과용하는 모습도 종종 본다. const ONE = 1 같은 선언은 의미가 없다. 리터럴이 함수 하나에서만 쓰이고 그 함수가 맥락 정보를 충분히 제공하여 헷갈릴 일이 없다면 상수로 바꿔 얻는 이득이 줄어든다.
'Clean Code' 카테고리의 다른 글
[리팩터링 2판 - 실전편] 11장 API 리팩터링 (0) | 2022.05.21 |
---|---|
[리팩터링 2판 - 실전편] 10장 조건부 로직 간소화 (1) | 2022.05.02 |
[리팩터링 2판 - 실전편] 08장 기능이동 (0) | 2022.04.04 |
[리팩터링 2판 - 실전편] 07장 캡슐화 (0) | 2022.03.26 |
[리팩터링 2판 - 실전편] 06장 기본적인 리팩터링 (0) | 2022.03.10 |