참고 : Refactoring
<메소드 정리>
1. Extract Method
코드의 목적이 드러나도록 별도의 메소드로 뽑아낸다.
2. Inline Method
코드의 목적이 명확할 때는 메소드를 다시 코드 안으로 넣는다.
3. Inline Temp
임시변수를 수식으로 바꾼다.
4. Replace Temp with Query
임시변수를 메소드로 바꾼다.
5. Introduce Explaining Variable
복잡한 수식에서는 자신의 목적을 잘 설명하는 임시변수를 사용한다.
6. Split Temporary Variable
하나의 임시변수를 여러곳에 사용할 때는 따로따로 임시변수를 만들어라.
7. Remove Assignments to Parameters
넘어온 파라미터에 값을 대입하지 말고 임시변수를 사용하라.
8. Replace Method with Method Object
긴메소드에서 Extract Method를 적용할 수 없을때, 객체로 바꾸어 여러 메소드로 분할한다.
9. Substitute Algorithm
알고리즘을 보다 명확히 하기 위해, 몸체를 새로운 알고리즘으로 바꾼다.
코드의 목적이 드러나도록 별도의 메소드로 뽑아낸다.
2. Inline Method
코드의 목적이 명확할 때는 메소드를 다시 코드 안으로 넣는다.
3. Inline Temp
임시변수를 수식으로 바꾼다.
4. Replace Temp with Query
임시변수를 메소드로 바꾼다.
5. Introduce Explaining Variable
복잡한 수식에서는 자신의 목적을 잘 설명하는 임시변수를 사용한다.
6. Split Temporary Variable
하나의 임시변수를 여러곳에 사용할 때는 따로따로 임시변수를 만들어라.
7. Remove Assignments to Parameters
넘어온 파라미터에 값을 대입하지 말고 임시변수를 사용하라.
8. Replace Method with Method Object
긴메소드에서 Extract Method를 적용할 수 없을때, 객체로 바꾸어 여러 메소드로 분할한다.
9. Substitute Algorithm
알고리즘을 보다 명확히 하기 위해, 몸체를 새로운 알고리즘으로 바꾼다.
<객체간의 이동>
10. Move Method
자신이 정의된 클래스보다 더 많은 기능을 사용하고 있는 클래스로 옮기고 이전 메소드는 위임으로 바꾸거나 제거하라
11. Move Field
자신이 정의된 클래스의 필드가 더 많이 사용되고 있는 다른 클래스로 옮기고 이전 필드는 변경한다.
12. Extract Class
두개의 클래스가 할일을 하나의 클래스가 할 경우 새로운 클래스로 나눈다.
13. Inline Class
클래스가 할일이 많지 않은 경우 필드와 메소드를 옮기고 삭제한다.
14. Hide Delegate
클라이언트가 객체의 위임클래스를 직접 호출할 경우, 서버에 메소드를 만들어 대리객체를 숨겨라.
15. Remove Middle Man
클래스가 간단한 위임을 너무 많이 하고 있는 경우에는, 클라이언트가 대리객체를 직접 호출하도록 하라
16. Introduce Foreign Method
사용하고 잇는 서버 클래스에 부가적인 메소드가 필요하지만 클래스를 수정할 수 없는 경우에는 첫번째 인자로 서버클래스의 인스턴스를 받는 메소드를 클라이언트에 만들어라.
17. Introduce Local Extension
사 용하고 있는 서버 클래스에 여러 개의 메소드를 추가할 필요가 있지만 서버 클래스를 수정할 수 없는 경우, 필요한 추가 메소드를 포함하는 새로운 클래스를 만들어라. 이 확장 클래스를 원래 클래스의 서브클래스 또는 래퍼클래스로 만들어라.
자신이 정의된 클래스보다 더 많은 기능을 사용하고 있는 클래스로 옮기고 이전 메소드는 위임으로 바꾸거나 제거하라
11. Move Field
자신이 정의된 클래스의 필드가 더 많이 사용되고 있는 다른 클래스로 옮기고 이전 필드는 변경한다.
12. Extract Class
두개의 클래스가 할일을 하나의 클래스가 할 경우 새로운 클래스로 나눈다.
13. Inline Class
클래스가 할일이 많지 않은 경우 필드와 메소드를 옮기고 삭제한다.
14. Hide Delegate
클라이언트가 객체의 위임클래스를 직접 호출할 경우, 서버에 메소드를 만들어 대리객체를 숨겨라.
15. Remove Middle Man
클래스가 간단한 위임을 너무 많이 하고 있는 경우에는, 클라이언트가 대리객체를 직접 호출하도록 하라
16. Introduce Foreign Method
사용하고 잇는 서버 클래스에 부가적인 메소드가 필요하지만 클래스를 수정할 수 없는 경우에는 첫번째 인자로 서버클래스의 인스턴스를 받는 메소드를 클라이언트에 만들어라.
17. Introduce Local Extension
사 용하고 있는 서버 클래스에 여러 개의 메소드를 추가할 필요가 있지만 서버 클래스를 수정할 수 없는 경우, 필요한 추가 메소드를 포함하는 새로운 클래스를 만들어라. 이 확장 클래스를 원래 클래스의 서브클래스 또는 래퍼클래스로 만들어라.
<데이터 구성>
18. Self Encapsulate Field
필드에 직접 접근하고 있는데 필드에 대한 결합이 이상해지면, 그 필드에 대한 get/set 메소드를 만들고 항상 이 메소드를 접근하라.
19. Replace Data Value with Object
추가적인 데이터나 동작을 필요로 하는 데이터 아이템이 있을 때는, 데이터 아이템을 객체로 바꾸어라.
20. Change Value to Reference
동일한 인스턴스를 여러개 가지고 있는 클래스가 있고 여러 개의 동일한 인스턴스를 하나의 개체로 바꾸고 싶으면 그 객체를 참조 객체로 바꾸어라. (예. 생성자를 팩토리메소드로)
21. Change Reference to Value
작고, 불변성이고, 관리하기가 어려운 참조 객체가 있는 경우, 그것을 값 객체로 바꾸어라.
22. Replace Array with Object
배열의 특정 요소가 다른 뜻을 가지고 있다면, 배열을 각각의 요소에 대한 필드를 가지는 객체로 바꿔라.
23. Duplicate Observed Data
GUI 컨트롤에서만 사용 가능한 도메인데이터가 있고, 도메인 메소드에서 접근이 필요한 경우, 그 데이터를 도메인 객체로 복사하고, 옵저버를 두어 두 데이터를 동기화하라.
24. Change Unidurectional Association to Bidirectional
각각 서로의 기능을 필요로 하는 클래스가 있는데, 링크가 한쪽 방향으로만 되어 있는 경우, 반대 방향으로 포인터를 추가하고, 수정자가 양쪽 세트를 모두 업데이트하게 변경하라.
25. Change Bidirectional Associaltion to Unidirectional
서로 링크를 가지는 두개의 클래스에서 한 쪽이 다른 한쪽을 더이상 필요로 하지 않을 때는 불필요한 링크를 제거하라.
26. Replace Magic Number with Symbolic Constant
특별한 의미를 가지는 숫자 리터럴이 있으면, 상수를 만들고, 의미를 잘 나타내도록 이름을 지은 다음 숫자를 상수로 바꾸어라.
27. Encapsulate Field
public 필드가 있는 경우, 그 필드를 private로 만들고, 접근자를 제공하라.
28. Encapsulate Collection
컬렉션을 리턴하는 메소드가 있으면, 그 메소드가 읽기 전용 뷰를 리턴하도록 만들고, add/remove 메소드를 제공하라.
29. Replace Record with Data Class
전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들어라.
30. Replase Type Code with Class
클래스의 동작에 영향을 미치지 않는 숫자로 된 타입 코드가 있으면, 숫자를 클래스로 바꾸어라.
31. Replace Type Code with Subclasses
클래스의 동작에 영향을 미치는 변경 불가능한 타입 코드가 있으면, 타입 코드를 서브클래스(아래로 내려라)로 바꾸어라.
32. Replace Type Code with State/Strategy
클래스의 동작에 영향을 미치는 타입코드가 있지만 서브 클래싱을 할 수 없을 경우, 타입 코드를 스테이트 객체로 바꾸어라.
33. Replace Subclass with Fields
상수데이터를 리턴하는 메소드만 다른 서브클래스가 있다면 그 메소드를 수퍼클래스의 필드로 바꾸고 서브클래스를 제거하라.
필드에 직접 접근하고 있는데 필드에 대한 결합이 이상해지면, 그 필드에 대한 get/set 메소드를 만들고 항상 이 메소드를 접근하라.
19. Replace Data Value with Object
추가적인 데이터나 동작을 필요로 하는 데이터 아이템이 있을 때는, 데이터 아이템을 객체로 바꾸어라.
20. Change Value to Reference
동일한 인스턴스를 여러개 가지고 있는 클래스가 있고 여러 개의 동일한 인스턴스를 하나의 개체로 바꾸고 싶으면 그 객체를 참조 객체로 바꾸어라. (예. 생성자를 팩토리메소드로)
21. Change Reference to Value
작고, 불변성이고, 관리하기가 어려운 참조 객체가 있는 경우, 그것을 값 객체로 바꾸어라.
22. Replace Array with Object
배열의 특정 요소가 다른 뜻을 가지고 있다면, 배열을 각각의 요소에 대한 필드를 가지는 객체로 바꿔라.
23. Duplicate Observed Data
GUI 컨트롤에서만 사용 가능한 도메인데이터가 있고, 도메인 메소드에서 접근이 필요한 경우, 그 데이터를 도메인 객체로 복사하고, 옵저버를 두어 두 데이터를 동기화하라.
24. Change Unidurectional Association to Bidirectional
각각 서로의 기능을 필요로 하는 클래스가 있는데, 링크가 한쪽 방향으로만 되어 있는 경우, 반대 방향으로 포인터를 추가하고, 수정자가 양쪽 세트를 모두 업데이트하게 변경하라.
25. Change Bidirectional Associaltion to Unidirectional
서로 링크를 가지는 두개의 클래스에서 한 쪽이 다른 한쪽을 더이상 필요로 하지 않을 때는 불필요한 링크를 제거하라.
26. Replace Magic Number with Symbolic Constant
특별한 의미를 가지는 숫자 리터럴이 있으면, 상수를 만들고, 의미를 잘 나타내도록 이름을 지은 다음 숫자를 상수로 바꾸어라.
27. Encapsulate Field
public 필드가 있는 경우, 그 필드를 private로 만들고, 접근자를 제공하라.
28. Encapsulate Collection
컬렉션을 리턴하는 메소드가 있으면, 그 메소드가 읽기 전용 뷰를 리턴하도록 만들고, add/remove 메소드를 제공하라.
29. Replace Record with Data Class
전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들어라.
30. Replase Type Code with Class
클래스의 동작에 영향을 미치지 않는 숫자로 된 타입 코드가 있으면, 숫자를 클래스로 바꾸어라.
31. Replace Type Code with Subclasses
클래스의 동작에 영향을 미치는 변경 불가능한 타입 코드가 있으면, 타입 코드를 서브클래스(아래로 내려라)로 바꾸어라.
32. Replace Type Code with State/Strategy
클래스의 동작에 영향을 미치는 타입코드가 있지만 서브 클래싱을 할 수 없을 경우, 타입 코드를 스테이트 객체로 바꾸어라.
33. Replace Subclass with Fields
상수데이터를 리턴하는 메소드만 다른 서브클래스가 있다면 그 메소드를 수퍼클래스의 필드로 바꾸고 서브클래스를 제거하라.
<조건문의 단순화>
34. Decompose Conditional
복잡한 조건문이 있는 경우, 조건, then부분, 그리고 else부분에서 메소드를 추출하라.
35. Consolidate Conditional Expression
같은 결과를 초래하는 일련의 조건 테스트가 있는 경우, 그것을 하나의 조건 식으로 결합하여 뽑아내라.
36. Consolidate Duplicate Conditional Fragments
동일한 코드 조각이 조건문의 모든 분기 안에 있는 경우, 동일한 코드를 조건문 밖으로 옮겨라.
37. Remove Control Flag
일련의 boolean 식에서 컨트롤 플래그 역할을 하는 변수가 있는 경우, break 또는 return을 대신 사용하라.
38. Replace Nested Conditional with Guard Clause
메소드가 정상적인 실행 경로를 불명확하게 하는 조건 동작을 가지고 있는 경우, 모든 특별한 경우에 대해서 보호절을 사용하라.
39. Replace Conditional with Polymorphism
객체의 타입에 따라 다른 동작을 선택하는 조건문을 가지고 있는 경우, 조건문의 각 부분을 서브클래스에 있는 오버라이딩 메소드로 옮겨라. 그리고 원래 메소드를 abstract로 만들어라.
40. Introduce Null Object
null체크를 반복적으로 하고 있다면, null값을 null객체로 대체하라.
41. Introduce Assertion
코드의 한부분이 프로그램의 상태에 대하여 어떤 것을 가정하고 있으면, assertion을 써서 가정을 명시되게 만들어라.(테스트에서 Assert.isTrue 같은 문장)
복잡한 조건문이 있는 경우, 조건, then부분, 그리고 else부분에서 메소드를 추출하라.
35. Consolidate Conditional Expression
같은 결과를 초래하는 일련의 조건 테스트가 있는 경우, 그것을 하나의 조건 식으로 결합하여 뽑아내라.
36. Consolidate Duplicate Conditional Fragments
동일한 코드 조각이 조건문의 모든 분기 안에 있는 경우, 동일한 코드를 조건문 밖으로 옮겨라.
37. Remove Control Flag
일련의 boolean 식에서 컨트롤 플래그 역할을 하는 변수가 있는 경우, break 또는 return을 대신 사용하라.
38. Replace Nested Conditional with Guard Clause
메소드가 정상적인 실행 경로를 불명확하게 하는 조건 동작을 가지고 있는 경우, 모든 특별한 경우에 대해서 보호절을 사용하라.
39. Replace Conditional with Polymorphism
객체의 타입에 따라 다른 동작을 선택하는 조건문을 가지고 있는 경우, 조건문의 각 부분을 서브클래스에 있는 오버라이딩 메소드로 옮겨라. 그리고 원래 메소드를 abstract로 만들어라.
40. Introduce Null Object
null체크를 반복적으로 하고 있다면, null값을 null객체로 대체하라.
41. Introduce Assertion
코드의 한부분이 프로그램의 상태에 대하여 어떤 것을 가정하고 있으면, assertion을 써서 가정을 명시되게 만들어라.(테스트에서 Assert.isTrue 같은 문장)
<메소드 호출의 단순화>
42. Rename Method
메소드의 이름이 그 목적을 드러내지 못하고 있다면 메소드의 이름을 바꿔라.
43. Add Parameter
44. Remove Parameter
45. Separate Query from Modifier
값을 리턴할 뿐만 아니라 객체의 상태도 변경하는 메소드를 가지고 있는 경우, 두개의 메소드를 만들어서 하나는 값을 리턴하는 역할을 하고, 하나는 개체의 상태를 변경하는 역할을 하게 하라.
46. Parameterize Method
몇몇 메소드가 메소드 몸체에 다른 값을 포함하고 있는 것을 제외하고는 비슷한 일을 하고 있다면, 다른 값을 파라미터로 넘겨받는 하나의 메소드를 만들어라.
47. Replace Parameter with Explicit Methods
파라미터의 값에 따라서 다른 코드를 실행하는 메소드가 있다면, 각각의 파라미터 값에 대한 별도의 메소드를 만들어라.
48. Preserve Whole Object
어떤 객체에서 여러개의 값을 얻은 다음 메소드를 호출하면서 파라미터로 넘기고 있다면, 대신 그 객체를 파라미터로 넘겨라.
49. Replace Parameter with Method
객체가 메소드를 호출한다음, 결과를 다른 메소드에 대한 파라미터로 넘기고 있다. 수신자(파라미터를 넘겨 받는 메소드) 또한 이 메소드를 호출할 수 있다면, 그 파라미터를 제거하고 수신자가 그 메소드를 호출하도록 하라.
50. Introduce Parameter Object
자연스럽게 몰려다니는 파라미터 그룹을 가지고 있다면, 그것을 객체로 바꾸어라.
51. Remove Setting Method
어떤 필드가 객체 생성시에 값이 정해지고 그 이후에는 변경되지 않아야 한다면, 그 필드값을 설정하는 모든 메소드를 제거하라.
52. Hide Method
메소드가 다른 클래스에서 사용되지 않는다면, 그 메소드를 private로 만들어라.
53. Replace Constructor with Factory Method
객체를 생성할 때 단순히 생성하는 것 이외에는 다른 작업도 하고 있다면, 생성자를 팩토리 메소드로 대체하라.
54. Encapsulate DownCast
메소드가 그 호출부에서 다운캐스트가 될 필요가 있는 객체를 리턴하고 있다면, 다운 캐스트를 하는 것을 메소드 안으로 옮겨라.
55. Replace Error Code with Exception
메소드가 에러를 나타내는 특별한 코드를 가지고 있다면, 대신 예외를 던져라.
56. Replace Exception with Test
호출부에서 먼저 검사할 수 있는 조건에 대해 예외를 던지고 있다면, 호출부가 먼저 검사하도록 바꿔라.
메소드의 이름이 그 목적을 드러내지 못하고 있다면 메소드의 이름을 바꿔라.
43. Add Parameter
44. Remove Parameter
45. Separate Query from Modifier
값을 리턴할 뿐만 아니라 객체의 상태도 변경하는 메소드를 가지고 있는 경우, 두개의 메소드를 만들어서 하나는 값을 리턴하는 역할을 하고, 하나는 개체의 상태를 변경하는 역할을 하게 하라.
46. Parameterize Method
몇몇 메소드가 메소드 몸체에 다른 값을 포함하고 있는 것을 제외하고는 비슷한 일을 하고 있다면, 다른 값을 파라미터로 넘겨받는 하나의 메소드를 만들어라.
47. Replace Parameter with Explicit Methods
파라미터의 값에 따라서 다른 코드를 실행하는 메소드가 있다면, 각각의 파라미터 값에 대한 별도의 메소드를 만들어라.
48. Preserve Whole Object
어떤 객체에서 여러개의 값을 얻은 다음 메소드를 호출하면서 파라미터로 넘기고 있다면, 대신 그 객체를 파라미터로 넘겨라.
49. Replace Parameter with Method
객체가 메소드를 호출한다음, 결과를 다른 메소드에 대한 파라미터로 넘기고 있다. 수신자(파라미터를 넘겨 받는 메소드) 또한 이 메소드를 호출할 수 있다면, 그 파라미터를 제거하고 수신자가 그 메소드를 호출하도록 하라.
50. Introduce Parameter Object
자연스럽게 몰려다니는 파라미터 그룹을 가지고 있다면, 그것을 객체로 바꾸어라.
51. Remove Setting Method
어떤 필드가 객체 생성시에 값이 정해지고 그 이후에는 변경되지 않아야 한다면, 그 필드값을 설정하는 모든 메소드를 제거하라.
52. Hide Method
메소드가 다른 클래스에서 사용되지 않는다면, 그 메소드를 private로 만들어라.
53. Replace Constructor with Factory Method
객체를 생성할 때 단순히 생성하는 것 이외에는 다른 작업도 하고 있다면, 생성자를 팩토리 메소드로 대체하라.
54. Encapsulate DownCast
메소드가 그 호출부에서 다운캐스트가 될 필요가 있는 객체를 리턴하고 있다면, 다운 캐스트를 하는 것을 메소드 안으로 옮겨라.
55. Replace Error Code with Exception
메소드가 에러를 나타내는 특별한 코드를 가지고 있다면, 대신 예외를 던져라.
56. Replace Exception with Test
호출부에서 먼저 검사할 수 있는 조건에 대해 예외를 던지고 있다면, 호출부가 먼저 검사하도록 바꿔라.
<일반화 다루기>
57. Pull Up Field
두 서브 클래스가 동일한 필드를 가지고 있다면, 그 필드를 수퍼클래스로 옮겨라.
58. Pull Up Method
동일한 일을 하는 메소드를 여러 서브클래스에서 가지고 있다면, 이 메소드를 수퍼클래스로 옮겨라.
59. Pull Up Contructor Body
서브 클래스들이 대부분 동일한 몸체를 가진 생성자를 가지고 있다면, 수퍼클래스에 생성자를 만들고 서브 클래스 메소드에서 이것을 호출하라.
60. Push Down Method
수퍼클래스에 있는 동작이 서브 클래스 중 일부에만 관련되어 있다면, 그동작을 관련된 서브클래스로 옮겨라.
61. Push Down Field
어떤 필드가 일부 서브클래스에 의해서만 사용되고 있다면, 그 필드를 관련된 서브 클래스로 옮겨라.
62. Extract SubClass
어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있다면 기능의 부분집합을 담당하는 서브 클래스를 만들어라.
63. Extract SuperClass
비슷한 메소드와 필드를 가진 두개의 클래스가 있다면, 수퍼클래스를 만들어서 공동된 메서드와 필드를 수퍼 클래스로 옮겨라.
64. Extract Interface
여러 클라이언트가 한 클래스 인터페이스의 동일한 부분 집합을 사용하고 있거나, 두 클래스가 공통된 인터페이스를 가지는 부분이 있다면, 그 부분 집합을 인터페이스로 뽑아내라.
65. Collapse Hierarchy
수퍼 클래스와 서브 클래스가 별로 다르지 않다면 그것들을 하나로 합쳐라.
66. Form Template Method
각 각의 서브 클래스에, 동일한 순서로 비슷한 단계를 행하지만 단계가 완전히 같지 않을 두 메소드가 있다면, 그 단계를 동일한 시그니처를 가진 메소드로 만들어라. 이렇게 하면 원래의 두 메소드는 서로 같아지므로 수퍼클래스로 올릴 수 있다.
67. Replace Inheritance with Delegation
서브클래스가 수퍼클래스의 인터페이스의 일부분만 사용하거나 또는 데이터를 상속 받고 싶지 않은 경우, 수퍼클래스를 위한 필드를 만들고 메소드들이 수퍼클래스에 위임하도록 변경한 후 상속 관계를 제거한다.
68. Replace Delegation with Inheritance
위임을 사용하고 있는데, 전체 인터페이스에 대한 간단한 위임을 자주 작성하고 있다면, 위임하는 클래스를 대리객체의 서브 클래스로 만들어라.
두 서브 클래스가 동일한 필드를 가지고 있다면, 그 필드를 수퍼클래스로 옮겨라.
58. Pull Up Method
동일한 일을 하는 메소드를 여러 서브클래스에서 가지고 있다면, 이 메소드를 수퍼클래스로 옮겨라.
59. Pull Up Contructor Body
서브 클래스들이 대부분 동일한 몸체를 가진 생성자를 가지고 있다면, 수퍼클래스에 생성자를 만들고 서브 클래스 메소드에서 이것을 호출하라.
60. Push Down Method
수퍼클래스에 있는 동작이 서브 클래스 중 일부에만 관련되어 있다면, 그동작을 관련된 서브클래스로 옮겨라.
61. Push Down Field
어떤 필드가 일부 서브클래스에 의해서만 사용되고 있다면, 그 필드를 관련된 서브 클래스로 옮겨라.
62. Extract SubClass
어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있다면 기능의 부분집합을 담당하는 서브 클래스를 만들어라.
63. Extract SuperClass
비슷한 메소드와 필드를 가진 두개의 클래스가 있다면, 수퍼클래스를 만들어서 공동된 메서드와 필드를 수퍼 클래스로 옮겨라.
64. Extract Interface
여러 클라이언트가 한 클래스 인터페이스의 동일한 부분 집합을 사용하고 있거나, 두 클래스가 공통된 인터페이스를 가지는 부분이 있다면, 그 부분 집합을 인터페이스로 뽑아내라.
65. Collapse Hierarchy
수퍼 클래스와 서브 클래스가 별로 다르지 않다면 그것들을 하나로 합쳐라.
66. Form Template Method
각 각의 서브 클래스에, 동일한 순서로 비슷한 단계를 행하지만 단계가 완전히 같지 않을 두 메소드가 있다면, 그 단계를 동일한 시그니처를 가진 메소드로 만들어라. 이렇게 하면 원래의 두 메소드는 서로 같아지므로 수퍼클래스로 올릴 수 있다.
67. Replace Inheritance with Delegation
서브클래스가 수퍼클래스의 인터페이스의 일부분만 사용하거나 또는 데이터를 상속 받고 싶지 않은 경우, 수퍼클래스를 위한 필드를 만들고 메소드들이 수퍼클래스에 위임하도록 변경한 후 상속 관계를 제거한다.
68. Replace Delegation with Inheritance
위임을 사용하고 있는데, 전체 인터페이스에 대한 간단한 위임을 자주 작성하고 있다면, 위임하는 클래스를 대리객체의 서브 클래스로 만들어라.
<대규모 리팩토링>
69. Tease Apart Inheritance
두 가지 작업을 한번에 처리하는 상속 구조가 있는 경우, 두개의 상속 구조를 만들고 하나가 다른 하나를 호출하도록 위임을 사용하라.
70. Convert Procedural Design to Objects
절차적 스타일로 작성된 코드가 있으면, 데이터 레코드를 개체로 바꾸고, 동작을 쪼개서 객체로 옮겨라.
71. Separate Domain from Presentation
도메인 로직을 포함하고 있는 Gui 클래스를 가지고 있다면, 도메인 로직을 분리하여 도메인 클래스를 만들어라.
72. Extract Hierachy
너무 많은 작업을 하거나 또는 부분적으로라도 많은 조건문이 있는 클래스에 대해서는, 각가의 서브 클래스가 특정 작업을 담당하도록 클래스의 상속 구조를 만들어라.
두 가지 작업을 한번에 처리하는 상속 구조가 있는 경우, 두개의 상속 구조를 만들고 하나가 다른 하나를 호출하도록 위임을 사용하라.
70. Convert Procedural Design to Objects
절차적 스타일로 작성된 코드가 있으면, 데이터 레코드를 개체로 바꾸고, 동작을 쪼개서 객체로 옮겨라.
71. Separate Domain from Presentation
도메인 로직을 포함하고 있는 Gui 클래스를 가지고 있다면, 도메인 로직을 분리하여 도메인 클래스를 만들어라.
72. Extract Hierachy
너무 많은 작업을 하거나 또는 부분적으로라도 많은 조건문이 있는 클래스에 대해서는, 각가의 서브 클래스가 특정 작업을 담당하도록 클래스의 상속 구조를 만들어라.
'프로그래밍' 카테고리의 다른 글
WebRequest 사용하여 Post로 보내기 (0) | 2015.02.13 |
---|---|
[VB] ANSI <-> UTF-8 변환 (0) | 2015.02.13 |
xsl에 파라미터를 넘기는 방법 (0) | 2015.02.13 |
구성된 식별자가 올바르지 않아 서버 프로세스를 시작하지 못했습니다. (0) | 2015.02.13 |
XSL 정렬방법 (0) | 2015.02.13 |