Reversing Method

좋은 코드는 이해하기 쉽게 해주는 리듬을 가지고 있다. 이 리듬이 깨지는 안좋은 코드의 예. 이번 예제는 스몰토크의 스트림과 관련된 코드인데, C++로 옮기기 좀 난감하므로, 내가 예제를 만들어 봤다. 이상하다고 생각하지 마라.
~cpp 
class Hero
{
/* ... */
public:
	void attack(Enemy& enemy)
	{
		seeEnemy(enemy);
		enemy.reduceHp(dmg);
		seeFarMountain();
	}
};
설정은 이렇다. 히어로에게 공격 명령을 내려주면 1. 적을 본다. 2. 적의 hp를 감소시킨다. 3. 먼-_-산을 본다. 이상하긴 하지만 예제를 급히 만들다 보니 어쩔 수 없었다.
세줄의 코드가 있는데, 1,3번째는 수신객체가 본인이지만, 2번째는 수신객체가 enemy이다. 이러면 안좋다는 것이다.

수신객체를 하나로 한정시켜 보자.
~cpp 
class Hero
{
/* ... */
public:
	void attack(Enemy& enemy)
	{
		seeEnemy(enemy);
		giveDmg(enemy, dmg);
		seeFarMountain();
	}
};
좀 어거지긴 하지만 어쨌든 이런식으로 하면 된다. 저렇게 수신 객체를 하나로 해줌으로써, 다른 파라메터에 영향을 받지 않게 된다.

SBPP에 있는 코드를 C++로 표현하면 이런 형태가 아닐까요?
ReversingMethod 사용전
~cpp 

class Point
{
	void printOn(Stream *s)
	{
		x->printOn(s);
		s->nextPutAll('@');
		y->printOn(s);
	}
}

ReversingMethod 사용후
~cpp 
class Stream
{
	void print(Object *o)
	{
		o->printOn(this);
	}
}
Class Point
{
	void printOn(Stream *s)
	{
		s->print(x);
		s->nextPutAll('@');
		s->print(y);
	}
}

그렇네요. C++의 iostream과 << 오버로딩으로 표현해보려고 하다가... 잘 안되서 위의 어거지 예제를 만든 것이었는데... 새로운 예제가 더 보기 좋네요. 알아보기도 쉽고...

Retrieved from http://wiki.zeropage.org/wiki.php/ReversingMethod
last modified 2021-02-07 05:27:55