Reversing Method ¶
좋은 코드는 이해하기 쉽게 해주는 리듬을 가지고 있다. 이 리듬이 깨지는 안좋은 코드의 예. 이번 예제는 스몰토크의 스트림과 관련된 코드인데, C++로 옮기기 좀 난감하므로, 내가 예제를 만들어 봤다. 이상하다고 생각하지 마라.
세줄의 코드가 있는데, 1,3번째는 수신객체가 본인이지만, 2번째는 수신객체가 enemy이다. 이러면 안좋다는 것이다.
~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 사용전
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과 << 오버로딩으로 표현해보려고 하다가... 잘 안되서 위의 어거지 예제를 만든 것이었는데... 새로운 예제가 더 보기 좋네요. 알아보기도 쉽고...