E D R , A S I H C RSS

Delegation Pattern

ν΄λž˜μŠ€μ— λŒ€ν•΄ κΈ°λŠ₯을 ν™•μž₯ν•˜λŠ” 두가지 방법쀑 ν•˜λ‚˜μ΄λ‹€. ν•˜λ‚˜λŠ” 상속이고 ν•˜λ‚˜λŠ” μœ„μž„(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

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:06
Processing time 0.0169 sec