본문 바로가기

Study/Refactoring11

리팩터링 12 12장 상속 다루기 12.1 메서드 올리기 반대 리팩터링 : 메서드 내리기 배경 여러 메서드들의 본문 코드가 똑같을 때 적용하기 가장 쉽다. 여러 클래스의 두 메서드를 각각 매개변수화 하면 궁극적으로 같은 메소드가 되기도 하는데, 이런 경우 각각의 함수를 매개변수화 한 다음 메서드를 상속 계층의 위로 올린다. 만약 해당 메서드의 본문에서 참조하는 필드들이 서브 클래스에만 있는 경우에는 해당 필드들을 먼저 슈퍼 클래스로 올린 후에 메서드를 올린다. 절차 똑같이 동작하는 메서드인지 면밀히 살핀다. 하는 일은 같지만 코드가 다른 경우 본문 코드가 똑같아질 때까지 리팩터링 한다. 메서드 안에서 호출하는 다른 메서드와 참조하는 필드들을 슈퍼클래스에서도 호출하고 참조할 수 있는지 확인한다. 메서드 시그니처가 다르다.. 2023. 8. 30.
리팩터링 11 11장 API 리팩터링 11.1 질의 함수와 변경 함수 분리하기 배경 우리는 외부에서 관찰할 수 있는 겉보기 부수효과가 전혀 없이 값을 반환해주는 함수를 추구해야 한다. 이를 위해 “질의 함수(읽기 함수)는 모두 부수효과가 없어야 한다”는 규칙을 따르는 것이다. 물론 이 규칙이 절대적인것은 아니지만 분명 유용하다. 만약 값을 반환하면서 부수효과도 가지는 함수가 있다면 상태를 변경하는 부분과 질의하는 부분의 분리를 시도해본다. 절차 대상 함수를 복제하고 질의 목적에 충실한 이름을 짓는다. 함수 내부를 살펴 무엇을 반환하는지 찾는다. 어떤 변수의 값을 반환한다면 그 변수 이름이 훌륭한 단초가 될 것이다. 새 질의 함수에서 부수효과를 모두 제거한다. 정적 검사를 수행한다. 원래 함수(변경 함수)를 호출하는 곳.. 2023. 8. 29.
리팩터링 챕터 10 10장 조건부 로직 간소화 10.1 조건문 분해하기 배경 조건부 로직이 복잡하면 프로그램을 복잡하게 만든다. 코드를 부위별로 분해하고 각 덩어리의 의도를 살린 이름의 함수 호출로 바꿔 전체적인 의도를 살린다. 절차 조건식과 그 조건식에 딸린 조건절 각각을 함수로 추출한다. 예시 if (!aDate.isBefore(plan.getSummerStart()) && !aDate.isAfter(plan.getSummerEnd())) { charge = quantity * plan.getSummerRate(); } else { charge = quantity * plan.getRegularRate() + plan.getRegularServiceCharge(); } 1. 조건 부분을 별도 함수로 추출하기 if (su.. 2023. 8. 28.
리팩터링 챕터 9 9장 - 데이터 조직화 9.1 변수 쪼개기 배경 변수에 대입이 여러번 이뤄진다면 여러가지 역할을 수행한다는 신호이므로 역할 하나당 하나의 변수로 쪼개야 한다. 절차 변수를 선언한 곳과 값을 처음 대입하는 곳에서 변수 이름을 바꾼다. 이후의 대입이 항상 i = i + 형태라면 수집 변수이므로 쪼개서는 안된다. 가능하면 불변으로 선언한다. 이 변수에 두 번쨰로 값을 대입하는 곳 앞까지의 모든 참조(이 변수가 쓰인 곳)를 새로운 변수 이름으로 바꾼다. 두 번쨰 대입 시 변수를 원해 이름으로 다시 선언한다. 테스트한다. 반복한다. 매 반복에서 변수를 새로운 이름으로 선언하고 다음번 대입 때까지의 모든 참조를 새 변수명으로 바꾼다. 이 과정을 마지막 대입까지 반복한다. 예시 9.2 필드 이름 바꾸기 배경 데이터 .. 2023. 8. 27.
728x90