리팩토링 10장 p357_p369

14

Click here to load reader

Upload: heo-seungwook

Post on 11-Jun-2015

870 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 리팩토링 10장 p357_p369

Refactoring 리팩토링

10장 - Replace Error Code with Exception - Replace Exception with Test - Pull Up Field

아꿈사 http://cafe.naver.com/architect1 TTF http://www.npteam.net

Page 2: 리팩토링 10장 p357_p369

Replace Error Code with Exception

■ 메소드가 에러를 나타내는 특별한 코드를 가지고 있다면, 대신 예외를 던져라.

Page 3: 리팩토링 10장 p357_p369

Replace Error Code with Exception

■ 동기 - Unix와 C에 기초한 시스템은 리턴코드를 사용 - 자바는 예외(exception)를 사용한다. 일반적인 처리과정과 예외 처리 과정의 분리 프로그램을 이해하기 쉽게 한다. ■ C++에서는 Exception보다는 ASSERT 구문을 활용 - 디버그 모드에서는 ASSERT를 활용하고, - 릴리스 모드에서는 Minidump를 활용한다.

예외를 사용해서 일반적인 처리과정과, 예외 처리 과정을 분리한다.

Page 4: 리팩토링 10장 p357_p369

Replace Error Code with Exception

■ 젃차 - 01 - 예외가 검사되어야 하는지(checked exception) 말아야 하는지(unchecked exception)를 결정 checked exception : 컴파일러가 명시적으로 예외처리 요구 unchecked exception : 컴파일러가 명시적으로 예외처리를 요구하지 않음 호출부가 호출젂에 조건을 테스트하려면, 비검사 예외(unchecked exception)로 처리 (테스트 중에 예외가 발생하지 않도록!)

Page 5: 리팩토링 10장 p357_p369

Replace Error Code with Exception

■ 젃차 - 02 - 호출부를 모두 찾아서 예외를 사용하도록 조정한다. 비검사 예외라면, 호출하는 부분에서 메소드를 호출하기 젂에 검사를 한다. 검사 예외라면, 호출하는 부분에서 try 블록안에서 메소드를 호출하도록 조정한다. - 새로운 용법을 반영하도록 메소드의 시그너처를 바꿔라.

Page 6: 리팩토링 10장 p357_p369

Replace Error Code with Exception

■ 예제 - 이 코드가 예외를 사용하도록 바꾸기 위해서 검사 예외를 사용할지, 비검사 예외를 사용할지 먼저 결정한다. 호출부의 책임인 경우 인출하기 젂에 잒액 검사 (비검사 예외) 인출 루틴의 책임인 경우 인터페이스에 예외를 선언한다. (검사 예외)

Page 7: 리팩토링 10장 p357_p369

Replace Exception with Test

■ 호출부에서 먼저 검사할 수 있는 조건에 대해 예외를 던지고 있다면, 호출부가 먼저 검사하도록 바꿔라.

Page 8: 리팩토링 10장 p357_p369

Replace Exception with Test

■ 동기 - 예외는 복잡한 코드를 피하게 해 준다. - 예외는 예외적인 동작(예상치 못한 에러)에 사용되어야 한다. - 예외가 조건 테스트를 대신하는 역할을 하면 안 된다.

예외는 조건 테스트를 하는 역할이 아니라, 예외적인 동작에서 사용되어야 한다.

Page 9: 리팩토링 10장 p357_p369

Replace Exception with Test

■ 젃차 - catch 블록의 코드를 If문의 적당한 부분에 복사한다. - catch 블록에 assertion을 추가해서 catch 블록이 실행되고 있는지를 확인한다. - 컴파일, 테스트를 한다. - catch 블록을 제거하고, try 블록을 제거한다. - 컴파일, 테스트를 한다.

Page 10: 리팩토링 10장 p357_p369

Pull Up Field

■ 두 서브클래스가 동일한 필드를 가지고 있다면, 그 필드를 수퍼 클래스로 옮겨라.

Page 11: 리팩토링 10장 p357_p369

Pull Up Field

■ 동기 - 서브 클래스들이 중복된 기능을 가지고 있는 경우가 발견된다. - 각 서브 클래스의 필드가 비슷한 방법으로 사용된다면 필드를 일반화 할 수 있다. (일반화 : 수퍼클래스로 옮기는 것)

중복된 데이터(필드) 정의를 없애고, 필드를 사용하는 메소드를 수퍼 클래스로 옮긴다.

Page 12: 리팩토링 10장 p357_p369

Pull Up Field

■ 젃차 - 01 - 대상 필드들이 동일한 방법으로 사용되는지 조사한다. - 필드 이름이 동일하지 않으면, 수퍼클래스에서 사용할 필드 이름으로 변경한다. - 컴파일, 테스트를 한다. - 수퍼 클래스에 새로운 필드를 만든다.

Page 13: 리팩토링 10장 p357_p369

Pull Up Field

■ 젃차 - 02 - 서브 클래스의 필드를 지운다. - 컴파일, 테스트를 한다. - 새로운 필드에 Self Encapsulate Field(205)를 사용하는 것을 고려한다.

Page 14: 리팩토링 10장 p357_p369