중복코드
- 중복 코드의 단점
- 비슷한지, 완전히 동일한 코드인지 주의 깊게 봐야한다.
- 코드를 변경할 때, 동일한 모든 곳의 코드를 변경해야 한다.
- 사용할 수 있는 리팩토링 기술
- 동일한 코드를 여러 메소드에서 사용하는 경우, 함수 추출하기
- 코드가 비슷하게 생겼지만 완전히 같지는 않은 경우, 코드 분리하기
- 여러 하위 클래스에 동일한 코드가 있다면 메소드 올리기
1. 함수 추출하기
- "의도"와 "구현" 분리(주관)
어떤 코드를 읽을 때 한 번에 술술 -> 의도
코드를 읽을 때 어떻게 작동하는 지 이해하려고 시간과 노력 -> 구현 - 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면 해당 코드를 함수로 분리하고
함수 이름으로 무슨 일을 하는지 표현할 수 있다 - 한 줄짜리 메소드도 괜찮은가?
- 거대한 함수 안에 들어있는 주석은 추출한 함수를 찾는데 있어서 좋은 단서가 될 수있다.
**함수 추출의 장점은 의도를 드러내기 위한 naming
이 가능 하다는 점
2. 코드 분리하기
- 관련있는 코드끼리 묶여있어야 코드를 더 쉽게 이해할 수 있다.
- 함수에서 사용할 변수를 상단에 미리 정의하기 보다는, 해당 변수를 사용하는 코드 바로 위에 선언
- 관련있는 코드끼리 묶은 다음, 함수 추출하기를 사용해서 더 깔끔하게 분리 가능
불릿 2 같은 경우 리팩토링의 저자 마틴 파울러의 주관이지만,
사용할 변수를 상단에 열거해놓는 것보다 사용하는 코드 바로위에 선언해야 블럭단위로 확인하기 좋다는 의견이라 나도 동의하여 저렇게 구현해봐야겠다.
**다른 리팩토링을 진행하기 전에 전처리 과정 처럼 진행
3. 메소드 올리기
- 중복 코드는 당장은 잘 동작하더라도 미래에 버그를 만들어 낼 빌미를 제공
- 여러 하위 클래스에 동일한 코드가 있다면, 손쉽게 이 방법을 적용할 수 있다.
- 비슷하지만 일부 값만 다른 경우라면, "함수 매개변수화하기" 리팩토링을 적용한 이후 이 방법을 사용할 수 있다.
- 하위 클래스에 있는 코드가 상위 클래스가 아닌 하위 클래스 기능에 의존하고 있다면 "필드 올리기"를 적용한 이후에 이 방법을 적용할 수 있다.
- 두 메소드가 비슷한 절차를 따르고 있다면, "템플릿 메소드 패턴" 적용을 고려할 수 있다.