개발 이야기 안하는 개발자

3장 코드에서 나는 악취 본문

Book/리팩터링 2판

3장 코드에서 나는 악취

07e 2023. 6. 9. 02:34
반응형

 

리팩터링할 시점은 냄새날때 이다.

 

냄새란? 그냥 딱 봐도 이게 뭐야...? 하는 그 순간이 바로 냄새인가 보다.

근데 여기서 말하는 냄새라는게 그냥 경험이 좀 필요해 보인다.

 

쓰일 리팩터링이 필요할 때는 서술하지 않을 예정이고, 냄새가 난다라는 표현도 모호한게 

요즘에선 리팩터링이 필요하다라는 생각은 경험이 좀 필요해 보인다.

 

오케이 들어가보자

https://tenor.com/ko/view/izone-new-hyemu-dae-hyewon-lets-go-gif-24484418

 

1. 기이한 이름

알아보기 어려운 이름? 딱 봤을때 무슨 기능인지 모르겠는 이름?

 -1. 함수 선언 바꾸기

 -2. 변수 이름 바꾸기

 -3. 필드 이름 바꾸기

 

2. 중복 코드

겹치는 코드들은 하나의 함수로 만들어서 여러군대에서 호출하거나 상속받으면 부모에게 줘버리자.

 -1. 함수 추출하기

 -2. 문장 슬라이드하기

 -3. 메서드 올리기

 

3. 긴 함수

함수 자체가 너무 길면 해당 내용을 보기 쉽게 줄이자!

 -1. 함수 추출하기

 -2. 임시 변수를 질의 함수로 바꾸기

 -3. 매개변수 객체 만들기

 -4. 객체 통째로 넘기기

 -5. 함수를 명령으로 바꾸기

 -6. 조건문 분해하기

 -7. 함수 추출하기

 -8. 조건부 로직을 다형성으로 바꾸기

 -9. 반복문 쪼개기

 

4. 긴 매개변수 목록

매개변수 막쓰면 읽기 어렵고 파악하기 어렵다

 -1. 매개변수를 질의 함수로 바꾸기

 -2. 객체 통째로 넘기기

 -3. 매개변수 객체 만들기

 -4. 플래그 인수 제거하기

 -5. 여러 함수를 클래스로 묶기

 

5. 전역 데이터

편하다고 막쓰면 파악하기 어렵다.

 -1. 변수 캡슐화 하기

 

6. 가변 데이터

어디서 변하는지, 언제 변하는지 파악하기 어렵기 때문에 왠만하면 못바꾸도록 , 바꾸기 어렵도록.

 -1. 변수 캡슐화 하기

 -2. 변수 쪼개기

 -3. 문장 슬라이드하기

 -4. 함수 추출하기

 -5. 질의 함수와 변경 함수 분리하기

 -6. 세터 제거하기

 -7. 파생 변수를 질의 함수로 바꾸기

 -8. 여러 함수를 클래스로 묶기

 -9. 여러 함수를 변환 함수로 묶기

 -10. 참조를 값으로 바꾸기

 

7. 뒤엉킨 변경

맥락 구분 안됌. 한 코드에 여러 기능이 섞여 들어감. 맥락별로 분리하면 된다.

 -1. 단계 쪼개기

 -2. 함수 옮기기

 -3. 함수 추출하기

 -4. 클래스 추출하기

 

8. 산탄총 수술

맥락 구분 안됌. 여러 코드에 흩뿌려짐. 맥락별로 분리하면 된다.

 -1. 함수 옮기기

 -2. 필드 옮기기

 -3. 여러 함수를 클래스로 묶기

 -4. 여러 함수를 변환 함수로 묶기

 -5. 단계 쪼개기

 -6. 함수 인라인하기

 -7. 클래스 인라인하기

 

9. 기능 편애

자기가 속한 모듈의 함수나 데이터보다 다른 모듈의 함수나 데이터와 상호작용할 일이 더 많을때.

 -1. 함수 옮기기

 -2. 함수 추출하기

 

10. 데이터 뭉치

데이터 항목 서너개가 여러 곳에서 항상 함께 뭉쳐있을때. 

 -1. 클래스 추출하기

 -2. 매개변수 객체 만들기

 -3. 객체 통째로 넘기기

 

11. 기본형 집착

문자열을 다룰때 특히 흔한대, 단순 문자 집합이나, 단위를 무시하고 사용할때 생기는 문제들

 -1. 기본형을 객체로 바꾸기

 -2. 타입 코드를 서브클래스로 바꾸기

 -3. 조건부 로직을 다형성으로 바꾸기

 -4. 클래스 추출하기

 -5. 매개변수 객체 만들기

 

12. 반복되는 Switch 문

 -1. 조건부 로직을 다형성으로 바꾸기

 

13. 반복문

 -1. 반복문을 파이프라인으로 바꾸기

 

14. 성의 없는 요소

구조가 필요가 없거나, 필요 없을 정도로 간단한 클래스들.

 -1. 함수 인라인하기

 -2. 클래스 인라인하기

 -3. 계층 합치기

 

15. 추측성 일반화

나중에 필요할꺼야~

 -1. 계층 합치기

 -2. 함수 인라인하기

 -3. 클래스 인라인하기

 -4. 함수 선언 바꾸기

 

16. 임시 필드

특정상황에서만 정의되는 변수들

 -1. 클래스 추출하기

 -2. 함수 옮기기

 -3. 특이 케이스 추가하기

 

17. 메시지 체인

a.b.c.d.e.r.f 같이 긴 체인들. 꼬리에 꼬리 물기

 -1. 위임 숨기기

 -2. 함수 추출하기

 -3. 함수 옮기기

 

18. 중개자

클래스가 과하게 다른 클래스를 구현에 임하고 있으면?

 -1. 중개자 제거하기

 -2. 함수 인라인하기

 

19. 내부자 거래

모듈사이의 데이터를 주고 받는 내용(결합도)가 낮아지도록 해야 한다.

 -1. 함수 옮기기

 -2. 필드 옮기기

 -3. 위임 숨기기

 -4. 서브클래스를 위임으로 바꾸기

 -5. 슈퍼클래스를 위임으로 바꾸기

 

20. 거대한 클래스

한 클래스가 해야 할 일이 많아지면 보기 어렵고 중복된다.

 -1. 클래스 추출하기

 -2. 슈퍼클래스 추출하기

 -3. 타입 코드를 서브클래스로 바꾸기

 

21. 서로 다른 인터페이스의 대안 클래스들

 -1. 함수 선언 바꾸기

 -2. 함수 옮기기

 -3. 슈퍼클래스 추출하기

 

22. 데이터 클래스

게터/세터 메서드로만 구성된 클래스들. 너무 깊이까지 함부로 다루지 않도록

 -1. 레코드 캡슐화 하기

 -2. 세터 제거하기

 -3. 함수 옮기기

 -4. 함수 추출하기

 -5. 단계 쪼개기

 

23. 상속 포기

부모의 유산을 원치 않거나 필요없다면?

 -1. 메서드 내리기

 -2. 필드 내리기

 -3. 서브클래스를 위임으로 바꾸기

 -4. 슈퍼 클래스를 위임으로 바꾸기

 

24. 주석

주석이 않좋은게 아님. 과하게 달려면 그만큼 코드가 어렵다는 뜻 아닐까?

 -1. 함수 추출하기

 -2. 함수 선언 바꾸기

 -3. 어서션 추가하기

(주석을 남겨야겠다는 생각이 들면, 가장 먼저 주석이 필요 없는 코드로 리팩터링 해본다.)

 

 

쭉 적으면서 느낀건

역시 리팩터링의 목적은 코드를 보기 쉽게 수정하는 것.

그렇기 때문에 함수 추출하기가 가장 많지 않나 생각한다.

 

아무래도 길면 읽기 어렵기도 하고 읽기도 싫어지니까.

 

기능단위로 쪼개서 보기 쉽게, 메서드 이름만 봐도 이해하기 쉽게 하는게 가장 큰 의미가 있지 않나 생각한다.

각 기능들은 앞으로 5장에서부터 차근차근 나오니까 그때 다시 정리해 보자.

반응형

'Book > 리팩터링 2판' 카테고리의 다른 글

12장 상속 다루기  (0) 2023.06.15
4장 테스트 구축하기  (0) 2023.06.09
2장 리팩터링 원칙  (0) 2023.05.27
1장 : 리팩터링  (0) 2023.05.27