리팩터링 3장

박경준·2022년 11월 8일
0

리팩터링 책 요약

목록 보기
3/7

언제 리팩터링을 하면 좋을까?

1. 기이한 이름

함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용해야 하는지 명확히 알 수 있도록 엄청나게 신경써서 이름을 지어야 한다.

2. 중복 코드

똑같은 코드 구조가 여러 곳에서 반복된다면 하나로 통합하여 더 나은 프로그램을 만들 수 있다.

3. 긴 함수

좋은 코드는 짧은 함수들의 연속된 간접 호출로부터 나온다. 물론 호출부와 선언부를 오가며 해독하는것은 힘든 일이다. 이는 적절한 네이밍으로 해결할 수 있다. 주석을 달만한 곳에는 함수를 만들고, 함수 이름은 의도가 드러나게 짓는다.

4. 긴 매개변수 목록

매개변수 목록이 길어지면 그 자체로 이해하기 어려울 때가 많다.

5. 전역 데이터

변수 캡슐화하기를 통해 접근 범위를 최소로 줄이는 것이 좋다.

6. 가변 데이터

변경하려는 값에 해당하는 복사본을 만들어서 반환하는 것이 좋다.

7. 뒤엉킨 변경

뒤엉킨 변경은 단일 책임 원칙이 제대로 지켜지지 않았을때 일어난다. 즉, 하나의 모듈이 서로 다른 이유들로 인해 여러 가지 방식으로 변경되는 일이 많을때 발생한다. ** 컴포넌트를 나누는 것에는 이런 효과도 있지 않을까?

8. 산탄총 수술

이는 뒤엉킨 변경과 반대의 현상이다. 코드를 변경할 때마다 자잘하게 수정해야 하는 클래스가 많을때 발생한다.

9. 기능 편애

프로그램을 모듈화할때는 코드를 여러 영역으로 나눈 뒤 영영 안에서 이뤄지는 상호작용은 최대한 늘리고 영역 간 이뤄지는 상호작용은 최소로 줄인다. 기능 편애는 흔히 어떤 함수가 자기가 속한 모듈의 함수나 데이터보다 다른 모듈의 함수나 데이터와 상호작용할 일이 더 많을때 발생한다.

10. 데이터 뭉치

데이터 뭉치인지 판별하려면 값 하나를 삭제해보고 나머지 데이터만으로는 의미가 없다면 객체로 묶어야하는 데이터 뭉치이다.

11. 기본형 집착

자신에게 주어진 문제에 딱 맞는 기초 타입(화폐, 좌표, 구간 등)을 직접 정의하여 사용해야한다. ** if (a < upper && a > lower) 이거를 어떻게 바꾸라는 말이지? -> 원시값을 직접 비교하는게 아니라 함수화하여 비교

12. 반복되는 switch문

똑같은 조건부 로직이 여러 곳에서 반복해 등장하는 코드를 다형성으로 바꿔본다.

13. 반복문

필터나 맵 같은 파이프라인 연산을 사용하면 코드에서 각 원소들이 어떻게 처리되는지 보다 쉽게 파악할 수 있다.

14. 성의 없는 요소

본문 코드를 그래도 쓰는 것과 진배 없는 함수, 실질적으로 메서드가 하나뿐인 클래스 등은 지우거나 합치는 것이 좋다.

15. 추측성 일반화

나중에 필요할거야 라는 생각으로 당장은 필요 없는 모든 종류의 후킹 포인트와 특이 케이스 처리 로직을 미리 작성해둔 것을 말한다.

16. 임시 필드

특정 상황에서만 값이 설정되는 필드를 가진 클래스도 있다. 임시 필드들과 관련된 코드를 새 클래스에 몰아넣는다.

17. 메시지 체인

클라이언트가 한 객체를 통해 다른 객체를 얻은 뒤 방금 얻은 객체에 또 다른 객체를 요청하는 식으로, 다른 객체를 요청하는 작업이 연쇄적으로 이어지는 코드를 말한다.

18. 중개자

클래스가 제공하는 메서드 중 절반이 다른 클래스에 구현을 위임하고 있을때 발생한다.

19. 내부자 거래

모듈 사이의 데이터 거래가 많으면 결합도가 높아져 좋지 않다. 그 양을 최소로 줄여야 한다.

20. 거대한 클래스

한 클래스가 너무 많은 일을 하려다보면 필드 수가 늘어난다. 그리고 클래스에 필드가 너무 많으면 중복 코드가 생기기 쉽다.

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

클래스를 사용할 때 장점은 언제든 다른 클래스로 교체할 수 있다는 것이다. 단 교체하려면 인터페이스가 같아야 한다.

22. 데이터 클래스

데이터 클래스란 데이터 필드와 게터/세터 메서드로만 구성된 클래스이다. 저장 용도로만 쓰이다 보니 다른 클래스가 너무 깊이까지 다룰 때가 많다. 이런 클래스에 public 데이터가 있다면 캡슐화 또는 세터 제거로 방어한다.

23. 상속 포기

수많은 부모 클래스의 유산 중에서 관심 있는 몇 개만 받고싶은 경우가 있다.

24. 주석

주석이 장황하게 달린 코드는 잘못 작성된 코드일 가능성이 높다. 주석을 남겨야겠다는 생각이 들면 가장 먼저 주석이 필요 없는 코드로 리팩토링 해본다. 왜 코드를 이렇게 짰는지에 대한 주석은 좋지만, 함수 동작을 설명하는 주석은 별루

profile
빠굥

0개의 댓글