ν΄λμ€μ λν΄ κΈ°λ₯μ νμ₯νλ λκ°μ§ λ°©λ²μ€ νλμ΄λ€. νλλ μμμ΄κ³ νλλ μμ(Delegation) μ΄λ€. μμμ νμ§ μμλ ν΄λΉ ν΄λμ€μ κΈ°λ₯μ νμ₯μν¬ μ μλ λ°©λ²μ΄ λλ€.
λν, ν΄λμ€ νλκ° λ°©λν΄μ§λ, μ μ νκ² κ·Έ ν΄λμ€μ μ±
μμ λ€λ₯Έ ν΄λμ€λ€μκ² μμν΄μ£Όλ κ²μ Refactoring μ λ°©λ²μ΄ λλ€.
ObjectOrientedProgramming μ ν λ μμ£Ό μ°μ΄λ μ½λ© μ€νμΌ. μλ§ μ¬λλ€μ΄ 무μμμ€μ μμ£Ό μΈ κ²μ΄λ€.
example) μμ μ VonNeumannAirport μ JuNe κ³Ό 1002 κ° Pair νλμ€ JuNe μ΄ μμ±νλ Refactoring μΌλ‘μμ Delegation.
~cpp public class Airport { private int _traffic; private int [] _arrivalGate; private int [] _departureGate; private PassengerSet psg; public int getTraffic() { ListIterator iter = psg.passengers.listIterator(); int [] passenger; while (iter.hasNext()) { passenger = (int [])iter.next(); movePassenger(passenger[0], passenger[1], passenger[2]); } return _traffic; } public void setArrivalGates(int [] aCity) { _arrivalGate = aCity; } public void setDepartureGates(int [] aCity) { _departureGate = aCity; } public int [] getArrivalGates() { return _arrivalGate; } public int [] getDepartureGates() { return _departureGate; } public int getDistance(int fromCity, int toCity){ int distance=java.lang.Math.abs(_getArrivalCityGate(fromCity) -_getDepartureCityGate(toCity))+1; return distance; } private void movePassenger(int fromCity, int toCity, int aNumber) { _traffic+=getDistance(fromCity,toCity)*aNumber; } public void setPassengers(PassengerSet psg) { this.psg=psg; } }μ¬κΈ°κΉμ§λ Airport μ΄λ€. νμ§λ§ VonNeumannAirport λ¬Έμ μμλ 보λ―, μ€μ Input μ λν΄μ Configuration μ μ¬λ¬ Set μ΄ λμ¨λ€.
μ΄ κΈ°λ₯μ μΆκ°νκΈ° μν΄ μΌλ¨ Airport Code λ₯Ό Refactoring νκΈ°λ‘ νλ€. μ΄λ₯Ό μν΄ Airport μ κΈ°λ₯μ€ Configuration κ³Ό κ΄λ ¨λ κΈ°λ₯μ λν΄ Configuration μ Extract νκ³ , λ΄λΆμ μΌλ‘λ Delegation ν¨μΌλ‘μ μΈλΆμ μΌλ‘ 보μ΄λ κΈ°λ₯μ λν΄μλ μΌκ΄μ±μ μ μ§νλ€. (Test Code κ° μΌμ’
μ Guard μν μ νμμ)
~cpp import java.util.ListIterator; class Configuration { private int [] _arrivalGate; private int [] _departureGate; private int id; public void setArrivalGates(int [] aCity) { _arrivalGate=aCity; } public void setDepartureGates(int [] aCity) { _departureGate=aCity; } public int [] getArrivalGates() { return _arrivalGate; } public int [] getDepartureGates() { return _departureGate; } public int getDistance(int fromCity, int toCity){ int distance=java.lang.Math.abs(_getArrivalCityGate(fromCity) -_getDepartureCityGate(toCity))+1; return distance; } public int _findInIntArray(int anInt,int [] anArray) { for (int i=0;i<anArray.length;i++) { if (anArray[i] == anInt) return i+1; } return -1; } public int _getArrivalCityGate(int aCity) { return _findInIntArray(aCity,getArrivalGates()); } public int _getDepartureCityGate(int aCity) { return _findInIntArray(aCity,getDepartureGates()); } public int getId() { return id; } public void setId(int anId) { id=anId; } } public class Airport { private int _traffic; private int [] _arrivalGate; private int [] _departureGate; private PassengerSet psg; private Configuration conf=new Configuration(); public int getTraffic() { ListIterator iter = psg.passengers.listIterator(); int [] passenger; while (iter.hasNext()) { passenger = (int [])iter.next(); movePassenger(passenger[0], passenger[1], passenger[2]); } return _traffic; } public void setArrivalGates(int [] aCity) { conf.setArrivalGates(aCity); } public void setDepartureGates(int [] aCity) { conf.setDepartureGates(aCity); } public int [] getArrivalGates() { return conf.getArrivalGates(); } public int [] getDepartureGates() { return conf.getDepartureGates(); } public int getDistance(int fromCity, int toCity){ return conf.getDistance(fromCity,toCity); } private void movePassenger(int fromCity, int toCity, int aNumber) { _traffic+=getDistance(fromCity,toCity)*aNumber; } public void setPassengers(PassengerSet psg) { this.psg=psg; } }
DelegationPatternμ μΈ λ μ€μν μ μ, DelegationPatternμ μ¬μ©νλ ν΄λμ€μ ν΄λΌμ΄μΈνΈλ κ·Έ ν΄λμ€κ° Delegationμ μ°λμ§ μμ°λμ§ λͺ°λΌμΌ νλ€λ κ²μ΄λ€. μ¦, μ°λ¦¬μκ² μμ΄ DelegationPatternμ΄ μ¬μ©λ ν΄λμ€λ μ¬λ ν΄λμ€μ λμΌνκ² μΈμλκ³ μ¬μ©λμ΄μ ΈμΌ νλ€. κ²μλ¬μ λ¨μκ² μμ μ μμ λ₯Ό μμνλ νμμ μ λ λ¨λ€μκ² κ·Έ μ¬μ€μ λ
ΈμΆν΄μ μλλ€.
ResponsibilityDrivenDesign , Refactoring, DelegationPattern μ κΎΈμ€ν μ§μΌμ£Όλ©΄ μ’μ μ½λκ° λμ¬ μ μλ€. (DesignPattern μ΄ μ λλμ΄μ§)
μ μ SE μμ
μ€μ μ»΄ν¬λνΈλͺ¨λΈμ νμμ±μ μ΄μΌκΈ°νλμ€ 'μμμΌλ‘μ μ¬μ¬μ©μ΄ μ΄λ ΅κΈ° λλ¬Έμ' μ΄μΌκΈ°λ₯Ό νμ
¨λλ°, μ λμ μ€ νλλ‘μμ Delegation μ λν μΈκΈμ΄ μ ν μμΌμ
¨λμ§ λͺ¨λ₯΄κ² λ€. Delegation λ§ μ μ΄ν΄ν΄λ μ€ μ»΄ν¬λνΈ μ€νμΌμ λͺ¨λν νλ‘κ·Έλλ°μ μ μ§νν μ μκ³ , μ¬λλ€ κ°μ μμ
λΆλ΄λ μ μ΄λμ΄ λΌ μ μμ건λ°.. --1002