리펙토링 10장 p316_p324

15
Refactoring 리팩토링 10- Add Parameter - Remove Parameter - Separate Query from Modifier 아꿈사 http://cafe.naver.com/architect1 TTF http://www.npteam.net

Transcript of 리펙토링 10장 p316_p324

Page 1: 리펙토링 10장 p316_p324

Refactoring 리팩토링

10장- Add Parameter

- Remove Parameter

- Separate Query from Modifier

아꿈사 http://cafe.naver.com/architect1

TTF http://www.npteam.net

Page 2: 리펙토링 10장 p316_p324

Add Parameter

■ 메소드를 호출할때 더 많은 정보가 필요하면,

정보를 포함한 객체를 파라미터로 추가하라.

Page 3: 리펙토링 10장 p316_p324

Add Parameter

■ 동기

- 리펙토링을 하지 않도록 유도하는 방향으로 접근

- 파라미터가 길어지면,

가독성이 떨어진다.

데이터 덩어리가 증가한다.

인터페이스가 변경된다.

■ 대안

- 정보를 담고 있는 객체를 넘긴다.

- Introduce Parameter Object(339)

대안을 먼저 알고, 파라미터를 추가한다.

Page 4: 리펙토링 10장 p316_p324

Add Parameter

■ 절차 - 01

- 메소드 시크너처가 수퍼/서브 클래스에

구현되어 있는지 살펴 본다.

- 파라미터를 추가한 새로운 메소드를 만든다.

(원래 메소드의 구현을 새로운 메소드로 복사)

- 컴파일, 테스트를 한다.

Page 5: 리펙토링 10장 p316_p324

Add Parameter

■ 절차 - 02

- 원래 메소드에서 새로 만든 메소드를

호출하도록 변경한다.

- 컴파일, 테스트를 한다.

- 원래 메소드를 참조하는 부분을

새로운 메소드를 참조하도록 수정한다.

- 원래 메소드를 제거한다.

- 컴파일, 테스트를 한다.

Page 6: 리펙토링 10장 p316_p324

Remove Parameter

■ 파라미터가 더 이상 사용되지 않으면,

파라미터를 제거하라.

Page 7: 리펙토링 10장 p316_p324

Remove Parameter

■ 동기

- 나중에 사용될지 모른다는 생각으로 불필요한

파라미터를 남겨둔다.

판단을 흐리게 하는 악마(Obfuscatis)

Obfuscates Obfuscation

(일부러) 애매하게 만들다.

- 파라미터를 제거하는 것은 쉬운 리펙토링이다.

- 다형성을 가진 메소드는 파라미터 제거에 주의!

불필요한 파라미터는 꼭 제거한다.

Page 8: 리펙토링 10장 p316_p324

Remove Parameter

■ 절차 - 01

- 메소드 시크너처가 수퍼/서브 클래스에

구현되어 있는지 살펴 본다.

자신 혹은 수퍼 클래스가 파라미터를

사용하고 있으면 제거하면 안 된다.

- 파라미터를 제거한 새로운 메소드를 만든다.

(원래 메소드의 구현을 새로운 메소드로 복사)

- 컴파일, 테스트를 한다.

Page 9: 리펙토링 10장 p316_p324

Remove Parameter

■ 절차 - 02

- 원래 메소드에서 새로 만든 메소드를

호출하도록 변경한다.

- 컴파일, 테스트를 한다.

- 원래 메소드를 참조하는 부분을

새로운 메소드를 참조하도록 수정한다.

- 원래 메소드를 제거한다.

- 컴파일, 테스트를 한다.

Page 10: 리펙토링 10장 p316_p324

Separate Query from Modifier

■ 질의와 변경을 분리한다!

값을 리턴하고, 객체의 상태를 변경하는 메소드를

1) 값을 리턴하는 메소드

2) 객체의 상태를 변경하는 메소드로

각각 분리하여 작성한다.

Page 11: 리펙토링 10장 p316_p324

Separate Query from Modifier

■ 동기

- 값을 리턴하는 메소드는 Side Effect가

없어야 한다.

- 값을 리턴하는 메소드가 Side Effect를 포함하면,

질의와 변경하는 부분을 분리해야 한다.

- Side Effect 설명

일반적으로 최적화를 위해 질의 결과 값을

캐쉬해서 사용한다.

캐쉬된 데이터를 변경하고, 다시 질의한 결과가

여전히 변경되지 않은 값일 경우.

Page 12: 리펙토링 10장 p316_p324

Separate Query from Modifier

■ 절차 - 01

- 원래 메소드와 동일한 값을 리턴하는

질의하는 메소드를 만든다.

- 원래 메소드를 수정해서 질의에 대한

호출 결과를 리턴하도록 한다.

- 컴파일, 테스트를 한다.

Page 13: 리펙토링 10장 p316_p324

Separate Query from Modifier

■ 절차 - 02

- 각각의 호출부에 대해서,

1) 원래 메소드를 호출하는 부분을

질의 메소드에 대한 호출로 바꾼다.

2) 질의 메소드를 호출하는 코드 앞에

원래 메소드를 호출하는 부분을 추가한다.

- 원래 메소드가 void 리턴 타입을 가지도록 하고

리턴 식을 제거한다.

Page 14: 리펙토링 10장 p316_p324

Separate Query from Modifier

■ 요약

- 질의하는 함수와 변경하는 함수를 분리한다.

1) 질의하는 함수를 만들어서 리턴값을 받는다.

2) 변경하는 함수는 void 리턴하도록 만든다.

3) 변경하는 함수를 호출하고,

질의하는 함수를 호출하여 처리한다.

Page 15: 리펙토링 10장 p316_p324