본문 바로가기

핌팩토링11

12. 상속 다루기 12.1 메서드 올리기 배경 중복된 두 메서드가 미래에는 냄새나는 쓰레기가 될 수 있다. 무언가 중복되었다는 것은 한쪽의 변경이 다른 쪽에는 반영되지 않을 수 있다는 위험을 항상 수반한다. 메서드 올리기를 적용하기 가장 쉬운 상황은 메서드들의 본문 코드가 똑같을 때이다. 절차 똑같이 동작하는 메서드인지 면밀히 살펴본다 메서드 안에서 호출하는 다른 메서드와 참조하는 필드들을 슈퍼클래스에서도 호출하고 참조할 수 있는지 확인한다. 메서드 시그니처가 다르다면 함수 선언 바꾸기로 슈퍼클래스에서 사용하고 싶은 형태로 통일한다. 슈퍼클래스에 새로운 메서드를 생성하고, 대상 메서드의 코드를 복사해넣는다. 서브클래스 중 하나의 메서드를 제거한다. 모든 서브 클래스의 메서드가 없어질 때까지 다른 서브클래스의 메서드를 하나.. 2022. 6. 19.
11. API 리팩터링 11. API 리팩터링 모듈과 함수는 소프트웨어를 구성하는 빌딩 블록이며, API는 이 블록들을 끼워 맞추는 연결부다. 좋은 API는 데이터를 갱신하는 함수와 조회만 하는 함수를 구분한다. 11.1 질의 함수와 변경 함수 분리하기 배경 외부에서 관찰할 수 있는 겉보기 부수효과가 전혀 없이 값을 반환해주는 함수를 추구해야 한다. 이런 함수는 원하는 만큼 호출해도 아무 문제가 없다. 겉보기 부수효과가 있는 함수와 없는 함수는 명확히 구분하는 것이 좋다. 상태를 변경하는 부분과 질의하는 부분을 분리하자 절차 대상 함수를 복제하고 질의 목적에 충실한 이름을 짓는다. 새 질의 함수에서 부수효과를 모두 제거한다. 원래 함수를 호출하는 곳을 모두 찾아낸다. 호출하는 곳에서 반환 값을 사용한다면 질의 함수를 호출하도록.. 2022. 6. 19.
10. 조건문 로직 간소화 10.1 조건문 분해하기 배경 복잡한 조건부 로직은 프로그램을 복잡하게 만드는 원흉이다. 조건을 검사하고 그 결과에 따른 동작을 표현한 코드는 모슨 일이 일어나는지는 이야기해주지만 ‘왜'일어나는지는 제대로 말해주지 않을 때가 많은 것이 문제다. 거대한 코드 블록이 주어지면 코드를 부위별로 분해한 다음 해체된 코드 덩어리들을 각 덩어리의 의도를 살린 이름의 함수 호출로 바꿔준다. 절차 조건식과 그 조건식에 딸린 조건절 각각을 함수로 추출한다. 예시 if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) { charge = quantity * plan.summerRate; } else { charge = quantity * plan... 2022. 4. 28.
9. 데이터 조직화 9. 데이터 조직화 9.1 변수 쪼개기 배경 역할이 둘 이상인 변수가 있다면 쪼개야 한다. 여러 용도로 쓰인 변수는 코드를 읽는 이에게 커다란 혼란을 주기 때문이다. 절차, 예시 let temp = 2 * (height + width); console.log(temp) temp = height * width; console.log(temp) 변수를 선언한 곳과 값을 처음 대입하는 곳에서 변수 이름을 바꾼다. let **perimeter** = 2 * (height + width); console.log(temp) temp = height * width; console.log(temp) 가능하면 이때 불변으로 선언한다. **const** perimeter = 2 * (height + width); cons.. 2022. 4. 28.