기존 코드의 디자인 재구성 개선 - 처리 개괄 관계

일부 재구성 기법은 전문적으로 유형의 개괄 관계, 즉 계승 관계를 처리하는 데 쓰인다.그 중에서 주로 함수를 상하로 계승 체계에 이동시킨다.

1, 필드 위로 이동


두 하위 클래스는 같은 필드를 가지고 있습니다.필드를 수퍼 클래스로 이동합니다.

2. 함수 위로 이동


어떤 함수들은 각 종류에서 완전히 같은 결과를 만들어 낸다.함수를 수퍼 클래스로 이동합니다.

3. Pull Up Constructor Body(구조 함수 본체 상향)


너는 각 하위 클래스에서 구조 함수를 가지고 있는데, 그것들의 본체는 거의 완전히 일치한다.초클래스에서 구조 함수를 새로 만들고 하위 클래스 구조 함수에서 호출합니다.
코드 1:
class Manager extends Employee...
public Manager(String name, String id, int grade){
_name = name;
_id = id;
_grade = grade;
}
코드 2:
public Manager(String name, String id, int grade){
super(name, id);
_grade = grade;
}

4. Push Down Method(함수 아래로 이동)


슈퍼클래스 중의 어떤 함수는 부분(전체가 아닌) 서브클래스와만 관계가 있다.이 함수를 관련된 하위 클래스로 옮겨라.

5, Push Down Field(필드 아래로 이동)


수퍼 클래스의 한 필드는 전체 하위 클래스가 아닌 부분적으로만 사용됩니다.이 필드를 필요로 하는 하위 클래스로 이동합니다.

6, Extract Subclass(추출부류)


클래스의 일부 특성은 전체가 아닌 일부 실례에만 사용됩니다.새 하위 클래스를 만듭니다. 위에서 말한 부분의 특성을 하위 클래스로 이동합니다.

7. Extract Superclass(하이퍼클래스 추출)


두 종류는 비슷한 특성을 가지고 있다.이 두 클래스를 위해 슈퍼클래스를 만들고 같은 특성을 슈퍼클래스로 옮깁니다.

8, Extract Interface(추출 인터페이스)


몇몇 고객들은 클래스 인터페이스 중의 동일한 서브집합을 사용하거나 두 종류의 인터페이스가 부분적으로 같다.같은 서브집합을 독립된 인터페이스로 추출합니다.

9. Collapse Hierarchy(상속 체계 축소)


10. Form Template Method(템플릿 함수 만들기)


동기: 당신은 하위 클래스가 있는데 그 중 상응하는 일부 함수는 같은 순서로 유사한 조작을 실행하지만 각 조작의 세부 사항은 다르다.
방법: 이러한 조작을 각각 독립 함수에 넣고 똑같은 서명을 유지하면 원 함수도 동일해진다.그런 다음 원래 함수를 상위 클래스로 이동합니다.
코드 1:
class Customer {
 
public String statement(){
return new TextStatement().value(this);
}
public String htmlStatement(){
return new HtmlStatement().value(this);
}
}
 
class TextStatement{
public String value(Customer aCustomer){
Enumeration<e> rentals = aCustomer.getRentals();
String result = "Rental Record for " + aCustomer.getName() + "
"; while(rentals.hasMoreElements()){ Rental each = (Rental) rentals.nextElement(); //show figures for this rental result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(each.getCharge()) + "
"; } //add footer lines result += "Amount owed is " + String.valueOf(aCustomer.getTotalCharge()) + "
"; result += "You earned " + String.valueOf(aCustomer.getTotalFrequentRenterPoints()) + " frequent renter points"; return result; } } class HtmlStatement { public String value(Customer aCustomer){ Enumeration<e> rentals = aCustomer.getRentals(); String result = "<H1>Rental Record for <EM>" + aCustomer.getName() + "</EM></H1><P>
"; while(rentals.hasMoreElements()){ Rental each = (Rental) rentals.nextElement(); //show figures for this rental result += each.getMovie().getTitle() + ":" + String.valueOf(each.getCharge()) + "<BR>
"; } //add footer lines result += "<P>You owed <EM>" + String.valueOf(aCustomer.getTotalCharge()) + "</EM><P>
"; result += "On this rental you earned <EM> " + String.valueOf(aCustomer.getTotalFrequentRenterPoints()) + "</EM> frequent renter points<P>"; return result; } }

코드2: 상기 두 종류 중 다른 부분을 추출하여 각각 독립 함수에 넣는다.
class TextStatement{
String headerString(Customer aCustomer){
return "Rental Record for " + aCustomer.getName() + "
"; } String eachRentalString(Rental aRental){ return "\t" + aRental.getMovie().getTitle() + "\t" + String.valueOf(aRental.getCharge()) + "
"; } String footerString(Customer aCustomer){ return "Amount owed is " + String.valueOf(aCustomer.getTotalCharge()) + "
" +"You earned " + String.valueOf(aCustomer.getTotalFrequentRenterPoints()) + " frequent renter points"; } public String value(Customer aCustomer){ Enumeration<e> rentals = aCustomer.getRentals(); String result = headerString(aCustomer); while(rentals.hasMoreElements()){ Rental each = (Rental) rentals.nextElement(); //show figures for this rental result += eachRentalString(each); } //add footer lines result += footerString(aCustomer); return result; } } class HtmlStatement { String headerString(Customer aCustomer){ return "<H1>Rental Record for <EM>" + aCustomer.getName() + "</EM></H1><P>
"; } String eachRentalString(Rental aRental){ return aRental.getMovie().getTitle() + ":" + String.valueOf(aRental.getCharge()) + "<BR>
"; } String footerString(Customer aCustomer){ return "<P>You owed <EM>" + String.valueOf(aCustomer.getTotalCharge()) + "</EM><P>
" + "On this rental you earned <EM> " + String.valueOf(aCustomer.getTotalFrequentRenterPoints()) + "</EM> frequent renter points<P>"; } public String value(Customer aCustomer){ Enumeration<e> rentals = aCustomer.getRentals(); String result = headerString(aCustomer); while(rentals.hasMoreElements()){ Rental each = (Rental) rentals.nextElement(); //show figures for this rental result += eachRentalString(each); } //add footer lines result += footerString(aCustomer); return result; } }

코드 3: 두 번째 처리를 통해 우리는 같은 함수를 초류에 추출할 것이다.함수 내용이 다르면 추상류로 추출한다.
abstract class Statement{
abstract String headerString(Customer aCustomer);
abstract String eachRentalString(Rental aRental);
abstract String footerString(Customer aCustomer);
public String value(Customer aCustomer){
Enumeration<e> rentals = aCustomer.getRentals();
String result = headerString(aCustomer);
while(rentals.hasMoreElements()){
Rental each = (Rental) rentals.nextElement();
//show figures for this rental
result += eachRentalString(each);
}
//add footer lines
result += footerString(aCustomer);
return result;
}
}

네 번째 단계: Text Statement, Html Statement는 Statement를 계승하고 추상 함수를 실현한다.

11. Replace Inheritance with Delegation(상속 대신 위임)


동기: 어떤 하위 클래스는 인터페이스의 일부분만 사용하거나 계승할 필요가 없는 데이터이다.
코드 1: My Stack의 사용자를 보면, 사용자는 4가지 일을 할 수 있습니다:push (), pop (),size (),isEmpty ().다음 두 함수는 Vector에서 계승된 것이다.
class MyStack extends Vector{
public void push(Object element){
insertElementAt(element, 0);
}
public Object pop(){
Object result = firstElement();
removeElementAt(0);
return result;
}
}
코드2: 봉인 모드와 약간 유사하지만 필요한 함수만 봉인합니다.
class MyStack{
private Vector _vector = new Vector();
public void push(Object element){
_vector.insertElementAt(element, 0);
}
public Object pop(){
Object result = _vector.firstElement();
_vector.removeElementAt(0);
return result;
}
public int size(){
return _vector.size();
}
public boolean isEmpty(){
return _vector.isEmpty();
}
}
12. Replace Delegation with Inheritance(상속으로 의뢰를 대체)
동기: 위탁 클래스의 모든 함수를 사용해야 합니다.

좋은 웹페이지 즐겨찾기