Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

ReversingMethod

From ZeroWiki

Reversing Method

좋은 코드는 이해하기 쉽게 해주는 리듬을 가지고 있다. 이 리듬이 깨지는 안좋은 코드의 예. 이번 예제는 스몰토크의 스트림과 관련된 코드인데, C++로 옮기기 좀 난감하므로, 내가 예제를 만들어 봤다. 이상하다고 생각하지 마라.

class Hero
{
/* ... */
public:
	void attack(Enemy& enemy)
	{
		seeEnemy(enemy);
		enemy.reduceHp(dmg);
		seeFarMountain();
	}
};

설정은 이렇다. 히어로에게 공격 명령을 내려주면 1. 적을 본다. 2. 적의 hp를 감소시킨다. 3. 먼-_-산을 본다. 이상하긴 하지만 예제를 급히 만들다 보니 어쩔 수 없었다. 세줄의 코드가 있는데, 1,3번째는 수신객체가 본인이지만, 2번째는 수신객체가 enemy이다. 이러면 안좋다는 것이다.


수신객체를 하나로 한정시켜 보자.

class Hero
{
/* ... */
public:
	void attack(Enemy& enemy)
	{
		seeEnemy(enemy);
		giveDmg(enemy, dmg);
		seeFarMountain();
	}
};

좀 어거지긴 하지만 어쨌든 이런식으로 하면 된다. 저렇게 수신 객체를 하나로 해줌으로써, 다른 파라메터에 영향을 받지 않게 된다.

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

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

ReversingMethod 사용후

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과 << 오버로딩으로 표현해보려고 하다가... 잘 안되서 위의 어거지 예제를 만든 것이었는데... 새로운 예제가 더 보기 좋네요. 알아보기도 쉽고...


SBPPSummary