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); }
์ ๋ฆฌํด๋๊ณ ๋ณด๋... ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค.--; ์์ด๋ ๋ค์ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋นํ ๋จ์ด์ง๋ค. ๋ณธ์ธ์ ํด์์ด ๋ถ์กฑํ ํ์ด๋ค. ๋น ๋ฅธ ์์ผ ๋ด์ ๋ณด๊ฐํด์ ์ฌ๋ฆฌ๊ฒ ๋ค.