31일 재구성 9: 커넥터 추출(Extract Interface)

우리가 코드 구조에서 한 클래스를 초과하여 다른 특수 클래스의 같은 방법을 사용하는 것을 알았을 때, 이 클래스의 방법을 추출하여 하나의 인터페이스 (interface) 에 넣고, 사용자 클래스에 접근하고 사용할 수 있도록 대외적으로 인터페이스를 제공해야 한다. 그러면 원래의 여러 클래스와 이 특수 클래스의 의존 관계를 깨뜨리는 데 도움이 된다.이 재구성 기법은 실현하기 쉬우며, 더욱 중요한 것은 이렇게 하면 결합을 늦추는 데 유리하다.
먼저 재구성 전의 코드를 봐라.
class ClassRegistration {
	
	public void createCode() {
		// create registration code
	}
	
	public void transfer() {
		// class transfer code
	}
	
	public double getTotal() {
		return 0.01;
	}
}

class RegistrationProcessor {
	
	public double processRegistration(ClassRegistration registration) {
		registration.createCode();
		return registration.getTotal();
	}
}

상기 예에서 만약에 여러 개의 서로 다른 Registration Processor 클래스가 있으면 자율적으로 서로 다른 등록 방식을 선택해야 한다. 즉, 등록ClassRegistration 클래스 역시 여러 가지 다른 실현 방법이 있다는 것이다.그러나 위의 코드에서 RegistrationProcessor 클래스는 단독의ClassRegistration 클래스와 밀접하게 결합되어 다른 구체적인 실현과 선택적으로 연결될 수 없다.
이러한 부족함을 해결하기 위해 ClassRegistration 클래스의create () 방법을 추출하여 새로운 인터페이스 (인터페이스) 에 넣고 재구성된 코드를 먼저 봅니다.
interface IRegistration {
	
	public void createCode();
	
	public double getTotal();
}

class ClassRegistration implements IRegistration {
	
	@Override
	public void createCode() {
		// create registration code
	}
	
	public void transfer() {
		// class transfer code
	}
	
	@Override
	public double getTotal() {
		return 0.01;
	}
}

class RegistrationProcessor {
	
	public double processRegistration(IRegistration registration) {
		registration.createCode();
		return registration.getTotal();
	}
}

재구성 후,ClassRegistration 클래스는 Iregistration 인터페이스를 실현했고, 이 인터페이스에 명시된 모든 방법을 실현했으며,ClassRegistration 클래스에서 @Override로 표시했다.가장 중요한 것은 RegistrationProcessor 클래스(즉 고객 클래스)가 자신의 프로세스 Registration () 방법에서 그 매개 변수 유형은 더 이상 구체적인 ClassRegistration 클래스가 아니라 Iregistration 인터페이스이다.이렇게 하면 Iregistration 인터페이스를 실현한 여러 개의 실현 클래스를 제공한 다음에 프로세스 Registration () 방법에 구체적으로 전송된 매개 변수로 실행할 때 도대체 어떤 실현인지 확인할 수 있습니다.
실제로 이것은 우리가 흔히 말하는'인터페이스 프로그래밍', 즉 다태적 메커니즘을 운용하는 장점이다.사용자 클래스는 구체적인 실현 클래스와 직접적으로 의존하지 않고 추상적인 인터페이스에 의존하는 데 중점을 두었다.
텍스트 링크:http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/07/refactoring-day-9-extract-interface.aspx

좋은 웹페이지 즐겨찾기