E D R , A S I H C RSS

Dispatched Interpretation

Dispatched Interpretation

인코딩은 프로그래밍에 있어서 필수적이다. 데이터가 계산으로부터 분리되어 있던 과거에는, 인코딩 작업은 매우 중요했다. 삑사리 한번 내면 돈 겁나 많이 들었다. 하지만 객체지향 시대에는 좀 다르다. 인코딩은 두번째로 밀려나고 객체들 사이의 책임을 분배하는 것이 가장 중요하게 된 것이다. 잘짜여진 OO 프로그램에는, 어떠한 정보에 관심을 가지는 객체가 하나밖에 없어야 한다. 그 객체는 자신의 정보에 직접 접근하고, 은밀하게 인코딩과 디코딩을 수행한다.

그.러.나. 객체의 정보가 다른 객체에 영향을 미쳐야만 할때가 있다. 간단할때는, 그냥 인코딩된 오브젝트에 메세지를 보내면 수월하게 해결이 가능하다. 하지만 복잡한 경우에는 힘들다. 문제는 수백의 클라이언트들에게 모든 타입의 정보에 대해 명시적으로 case 형태의 구조를 만들기를 원하지 않는다는 것이다.(??)

역시 코드로 이해하는 것이 빠르다. Shape 객체는 line, curve, stroke, fill 커맨드들의 순차적인 조합으로 이루어져 있다. 이것은 commandAt(int)라는 n번째 커맨드를 리턴해주는 메세지와, argumentsAt(int)라는 커맨드에 넘겨줄 인자들의 배열을 리턴해주는 메세지를 제공해준다.
~cpp 
class PostScriptShapePrinter
{
public:
	void display(Shape& aShape)
	{
		for(int i = 0 ; i < aShape.size() ; ++i)
		{	
			void* command = aShape.commandAt(i); // 문법 맞나?--;
			Arguments& argument = aShape.argumentsAt(i);
			if(command == lineFunc)
			{
				printPoint(argument.at(1));
				space();
				printPoint(argument.at(2));
				space();
				nextPutAll("line");
			}
			else if(command == curveFunc)
			/*	...	*/
		}
	}
};
위의 코드를 보면 알겠지만, CURVE 다음에는 STROKE, FILL 등이 계속 나올 것이다. 즉, case 구조를 씀으로써, OAOO의 원칙을 위반하고 있다. 이에 우리는 case 구조가 인코딩된 객체 안에 숨겨지도록 하는 해결책이 필요하다.

모든 커맨드를 위한 case 구문을 쓰지 말고, PostScriptShapePrinter에 모든 커맨드를 두자.
~cpp 
void PostScriptShapePrinter::line(Point& from, Point& to)
{
	printPoint(from);
	space();
	printPoint(to);
	space();
	nextPutAll("line");	
}
void PostScriptShapePrinter::curve(/* ... */) { /* ... */ }
/* ... */

또한, commantAt이나 argumentAt같은 메세지 말고, sendCommand(at,to) 같은 메세지를 제공하자. 위의 line,curve도 이꼴이므로 같이 다룰수 있다.
~cpp 
void PostScriptShapePrinter::display(Shape& aShape)
{
	for(int i = 0 ; i < aShape.size() ; ++i)
	{
		aShape.sendCommand(i,this);
	}
}
저 메소드는 Shape로 가는게 좋을 듯하다.
~cpp 
void Shape::sendCommandTo(Object& anObject)
{
	for(int i = 0 ; i < size() ; ++i)
	{
		sendCommand(i,object);
	}
}
그러면 이렇게 간단해진다.
~cpp 
void PostScriptShapePrinter::display(Shape& aShape)
{
	aShape.sendCommandTo(this);
}

정리해놓고 보니... 무슨 말인지 모르겠다.--; 앞이랑 뒤의 연관관계가 상당히 떨어진다. 본인의 해석이 부족한 탓이다. 빠른 시일 내에 보강해서 올리겠다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0996 sec