아래의 글은 마틴 파울러 지음 김지원 옮김, 『리팩토링 코드 품질을 개선하는 객체지향 사고법』,한빛미디어(2012)의 내용을 기반으로 작성하였습니다.
이름 | 요약 | 동기 | 예제 |
Extract Method 메서드 추출 |
코드의 뭉치를 별도의 메서드로 빼내는 기법 | 가장 많이 사용하고 핵심적인 기법 메서드 이름을 이해하기 쉽게 작성 |
|
Inline Method 메서드 내용 직접 삽입 |
메서드 내용이 너무 단순해서 메서드 명만 봐도 너무 뻔할 땐 그 메서더의 기능을 호출하는 메서드에 넣어버리고 그 메서드는 삭제하자 | 메서드를 간결하게 만드는 것 과다한 인다이렉션과 동시에 단순 위임이 너무 많을 때 사용 |
int getRating() { return moreThanFiveLaterDeliveries() ? 2 : 1 } boolean moreThanFiveDeliveries() { return numberOfLateDelivereis > 5; } RF > int geetRating() { return numberOfLateDeliveries > 5 ? 2 : 1 } |
Inline Temp 임시변수 내용 직접 삽입 |
간단한 수식을 대입 받는 임시변수로 인해 임시변수를 참조하는 부분을 전부 수식으로 치환 | double basePrice = anOrder.basePrice(); return basePrice > 1000; RF > return anOrder.basePrice() > 1000 |
|
Replace Temp with Query 임시변수를 메서드 호출로 전환 |
수식의 결과를 저장하는 임시변수가 있을 땐 그 수식을 빼내어 메서드로 만든후 교체 | 임시변수에 값이 한번만 대입되고 대입문을 이루는 수식에 문제가 없는 경우 | double basePrice = quantity * itemPrice; if ( basePrice > 1000 ) return basePrice * 0.95; else return basePrice * 0.98; RF > if (basePrice() > 1000) return basePrice * 0.95 else return basePrice * 0.98 double basePrice() { return quantity * itemPrice; } |
Introduce Explaining Variable 직관적 임시변수 사용 |
수식이 복잡해서 이해하기 어려울 경우 | if ( platform.indexOf("MAC") > -1) && resize > 0) { } RF > boolean isMac = platform.indexOf("MAC) > -1; boolean wasResized = resize > 0; if ( isMac && wasResized ) { } |
|
Split Temporary Variable 임시변수 분리 |
루프변수나 값 누적용 임시변수가 아닌 여러 번 값이 때입될땐 각 대입마다 다른 임시변수 사용 | double acc = primaryForce / mass; if ( secondTime > 0) { acc = primaryForce + secondaryForce / mass; } RF > if (secondTime > 0) { final double secondaryAcc = primaryForce + secondaryForce / mass; } |
|
Remove Assignments to Parameters 매개변수로의 값 대입 제거 |
매개 변수로 대입하는 코드가 있을 땐 매개변수 대신 임시변수를 사용하자 | int discount ( int inputVal, int quantity, int yearToDate) { if (inputVal > 50) inputVal -= 2; return inputVal; } RF > int discount(int inputVal, int quantity, int yearToDate) { int result = inputVal; if ( inputVal > 50 ) result -= 2; return result; } |
|
Replace Metod with Method Object 매서드를 매서드 객체로 전환 |
지역변수 때문에 매서드 추출을 적용할 수 없는 긴 메서드가 있을때 그 메서드 자체를 객체로 전환해서 모든 지역변수를 객체의 필드로 만들고 그런 다음 그 메서드를 객체 안의 여러 매서드로 쪼개기 | ||
Substitude Algorithm 알고리즘 전환 |
알로리즘을 더 분명한 것으로 교체해야 할 땐, 해당 메서드의 내용을 새 알고리즘을 바꾸자 | String foundPerson(String[] people) { for (String p : people) { if (p.equals("Don") return "Don"; if (p.equals("John") return "John"; return "None"; } RF > String foundPerson(String[] people) { List matchName = Arrays.asList("Don", "John"); for (String p : people) { if (p.contains(matchName(i)) return matchName(i); } } |
'독서관련 > 리팩토링 - 2012 - 마틴 파울러' 카테고리의 다른 글
CH02 리팩토링 예제 실행 코드 (0) | 2020.12.12 |
---|---|
CH04. 테스트 작성 (0) | 2020.12.12 |
CH03. 코드의 냄새 (0) | 2020.12.12 |
CH02. 리팩토링 개론 (0) | 2020.12.12 |
CH01. 예제를 통한 리팩토링 개념 잡기 (0) | 2020.12.07 |