1. Refactoring 리팩토링 10장 - Add Parameter - Remove Parameter - Separate Query from Modifier 아꿈사http://cafe.naver.com/architect1 TTF http://www.npteam.net
2. Add Parameter ■ 메소드를호출할때 더 많은 정보가 필요하면, 정보를 포함한 객체를 파라미터로 추가하라.
3. Add Parameter ■ 동기 - 리펙토링을 하지 않도록 유도하는 방향으로 접근 - 파라미터가 길어지면, 가독성이 떨어진다. 데이터 덩어리가 증가한다. 인터페이스가 변경된다. ■ 대안 - 정보를 담고 있는 객체를 넘긴다. - Introduce Parameter Object(339) 대안을 먼저 알고, 파라미터를 추가한다.
4. Add Parameter ■ 절차 - 01 - 메소드시크너처가수퍼/서브 클래스에 구현되어있는지 살펴 본다. - 파라미터를 추가한 새로운 메소드를 만든다. (원래 메소드의 구현을 새로운 메소드로 복사) - 컴파일, 테스트를 한다.
5. Add Parameter ■ 절차 - 02 - 원래 메소드에서 새로 만든 메소드를 호출하도록 변경한다. - 컴파일, 테스트를 한다. - 원래 메소드를 참조하는 부분을 새로운 메소드를 참조하도록 수정한다. - 원래 메소드를 제거한다. - 컴파일, 테스트를 한다.
7. Remove Parameter ■ 동기 - 나중에 사용될지 모른다는 생각으로 불필요한 파라미터를 남겨둔다. 판단을 흐리게 하는 악마(Obfuscatis) Obfuscates Obfuscation (일부러) 애매하게 만들다. - 파라미터를 제거하는 것은 쉬운 리펙토링이다. - 다형성을 가진 메소드는파라미터 제거에 주의! 불필요한 파라미터는 꼭 제거한다.
8. Remove Parameter ■ 절차 - 01 - 메소드시크너처가수퍼/서브 클래스에 구현되어있는지 살펴 본다. 자신 혹은 수퍼 클래스가 파라미터를사용하고 있으면 제거하면 안 된다. - 파라미터를 제거한 새로운 메소드를 만든다. (원래 메소드의 구현을 새로운 메소드로 복사) - 컴파일, 테스트를 한다.
9. Remove Parameter ■ 절차 - 02 - 원래 메소드에서 새로 만든 메소드를 호출하도록 변경한다. - 컴파일, 테스트를 한다. - 원래 메소드를 참조하는 부분을 새로운 메소드를 참조하도록 수정한다. - 원래 메소드를 제거한다. - 컴파일, 테스트를 한다.
10. Separate Query from Modifier ■ 질의와 변경을 분리한다! 값을 리턴하고, 객체의 상태를 변경하는 메소드를 1) 값을 리턴하는메소드 2) 객체의 상태를 변경하는 메소드로 각각 분리하여 작성한다.
11. Separate Query from Modifier ■ 동기 - 값을 리턴하는메소드는Side Effect가 없어야 한다. - 값을 리턴하는메소드가Side Effect를 포함하면, 질의와 변경하는 부분을 분리해야 한다. - Side Effect 설명 일반적으로 최적화를 위해 질의 결과 값을 캐쉬해서 사용한다. 캐쉬된 데이터를 변경하고, 다시 질의한 결과가 여전히 변경되지 않은 값일 경우.
12. Separate Query from Modifier ■ 절차 - 01 - 원래 메소드와 동일한 값을 리턴하는 질의하는 메소드를 만든다. - 원래 메소드를 수정해서 질의에 대한 호출 결과를 리턴하도록 한다. - 컴파일, 테스트를 한다.
13. Separate Query from Modifier ■ 절차 - 02 - 각각의 호출부에 대해서, 1) 원래 메소드를 호출하는 부분을 질의 메소드에 대한 호출로 바꾼다. 2) 질의 메소드를 호출하는 코드 앞에 원래 메소드를호출하는 부분을 추가한다. - 원래 메소드가void 리턴 타입을 가지도록 하고 리턴 식을 제거한다.
14. Separate Query from Modifier ■ 요약 - 질의하는 함수와 변경하는 함수를 분리한다. 1) 질의하는 함수를 만들어서 리턴값을 받는다. 2) 변경하는 함수는 void 리턴하도록 만든다. 3) 변경하는 함수를 호출하고, 질의하는 함수를 호출하여 처리한다.