From GoF.
1.1. Intent ¶
์๋ธ์์คํ
์ ์ธํฐํ์ด์ค์งํฉ์ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. Facade๋ ๊ณ ๊ธ๋ ๋ฒจ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํจ์ผ๋ก์ ์๋ธ์์คํ
์ ๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ํด์ค๋ค.
1.2. Motivation ¶
์๋ธ์์คํ
์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ณต์กํจ์ ์ค์ด๋๋ฐ ๋์์ ์ค๋ค. ์ผ๋ฐ์ ์ธ ๋์์ธ์ ๋ชฉ์ ์ ๊ฐ ์๋ธ์์คํ
๊ฐ์ ํต์ ๊ณผ ์์กด์ฑ์ ์ต์ํ์ํค๋ ๊ฒ์ด๋ค. ์ด ๋ชฉ์ ์ ์ฑ์ทจํ๊ธฐ ์ํ ํ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก๋ ๋จ์ผํ๊ณ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ facade object๋ฅผ ๋์
ํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๊ธฐ ์ํด, ์ดํ๋ฆฌ์ผ์ด์
์๊ฒ ์ปดํ์ผ๋ฌ ์๋ธ์์คํ
์ ์ ๊ณตํด์ฃผ๋ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ด ์๋ค๊ณ ํ์. ์ด ์๋ธ์์คํ
์ ์ปดํ์ผ๋ฌ๋ฅผ ๊ตฌํํ๋ Scanner, Parser, ProgramNode, BytecodeStream, ๊ทธ๋ฆฌ๊ณ ProgramNodeBuilder ํด๋์ค๋ฅผ ํฌํจํ๊ณ ์๋ค. ๋ช๋ช ํน์ํ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ด๋ฌํ ํด๋์ค๋ค์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ํ์๊ฐ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง, ๋๋ถ๋ถ์ ์ปดํ์ผ๋ฌ ์์คํ
์ ์ด์ฉํ๋ ํด๋ผ์ด์ธํธ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ๋ฌธ๋ถ์(Parsing)์ด๋ ์ฝ๋ ๋ณํ (Code generation) ์ ์ธ๋ถ์ ์ธ ๋ถ๋ถ์ ๋ํด ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.(๊ทธ๋ค์ ๋จ์ง ์ฝ๊ฐ์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํ ๋ฟ์ด์ง ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ํ์๊ฐ ์๋ค.) ๊ทธ๋ฌํ ํด๋ผ์ด์ธํธ๋ค์๊ฒ๋ ์ปดํ์ผ๋ฌ ์๋ธ์์คํ
์ ๊ฐ๋ ฅํ์ง๋ง ์ ๊ธ๋ ๋ฒจ์ธ ์ธํฐํ์ด์ค๋ ๋จ์ง ๊ทธ๋ค์ ์์
์ ๋ณต์กํ๊ฒ ๋ง๋ค ๋ฟ์ด๋ค.
์ด๋ฌํ ํด๋์ค๋ค๋ก๋ถํฐ ํด๋ผ์ด์ธํธ๋ค์ ๋ณดํธํ ์ ์๋ ๊ณ ๊ธ๋ ๋ฒจ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ ์๋ธ์์คํ
์ facade ๋ก์ Compiler class๋ฅผ ํฌํจํ๋ค. ์ด๋ฌํ ํด๋์ค๋ ์ปดํ์ผ๋ฌ์ ๊ฐ ๊ธฐ๋ฅ์ฑ๋ค์ ๋ํ ๋จ์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. Compiler class๋ facade (์๋์ ๋จ์ด ๋ป์ ๊ฑด๋ฌผ์ ์ ๋ฉด. ์ธ๊ด, ๊ฒ๋ณด๊ธฐ..) ๋ก์ ์์ฉํ๋ค. Compiler class๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ์ปดํ์ผ๋ฌ ์๋ธ์์คํ
์ ๋ํ ๋จ์ผํ๊ณ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. Compiler class๋ ์ปดํ์ผ๋ฌ์ ๊ฐ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ํด๋์ค๋ค์ ์๋ฒฝํ๊ฒ ์ํ์ํค์ง ์๊ณ , ํ๋์ ํด๋์ค์ ํฌํจ์์ผ์ ๋ถ์ธ๋ค. ์ปดํ์ผ๋ฌ facade ๋์ ๊ธ๋ ๋ฒจ์ ๊ธฐ๋ฅ๋ค์ ์ํ์์ด ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ํธ๋ฆฌ์ฑ์ ์ ๊ณตํ๋ค.
1.3. Applicabilty ¶
์ด๋ด๋ Facade Pattern์ ์ฌ์ฉํ๋ผ.
- ๋ณต์กํ ์๋ธ ์์คํ
์ ๋ํด ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๋. ์๋ธ์์คํ
์ ์ข
์ข
์์คํ
๋ค์ด ๋ฐ์ ๋์ด๋๊ฐ๋ฉด์ ๋์ฑ ๋ณต์ก์ฑ์ ๋๊ฒ ๋๋ค. ๋๋ถ๋ถ์ ํจํด๋ค์ ํจํด์ด ์ ์ฉ๋ ๊ฒฐ๊ณผ๋ก ๋ง๊ณ ์์ ํด๋์ค๋ค์ด ๋๊ฒ ํ๋ค. ํจํด์ ์ ์ฉ์ ์๋ธ์์คํ
๋ค์ด ๋ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ์ปค์คํฐ๋ง์ด์ฆํ๊ธฐ ์ฝ๊ฒ ํ์ง๋ง, ์ปค์คํฐ๋ง์ด์ฆํ ํ์๊ฐ ์๋ ํด๋ผ์ด์ธํธ๋ค์ด ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. Facade๋ ์๋ธ์์คํ
์ ๋ํ ๋จ์ํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์๊ฐ์ ์ ๊ณตํ๋ค. ์ด๋ฌํ ์๊ฐ์ ๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ์ถฉ๋ถํ๋ค. ์ปค์คํฐ๋ง์ด์ฆ๊ฐ ํ์ํ ํด๋ผ์ด์ธํธ๋ค์๊ฒ๋ง์ด facade๋ฅผ ๋์ด์ ๋ณผ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ๋ค๊ณผ ์ถ์ ํด๋์ค๋ค์ ๊ตฌํ ์ฌ์ด์๋ ๋ง์ ์์กด์ฑ์ด ์๋ค. ํด๋ผ์ด์ธํธ์ ์๋ธ์์คํ
์ฌ์ด๋ฅผ ๋ถ๋ฆฌ์ํค๊ธฐ ์ํด facade๋ฅผ ๋์
ํ๋ผ. ๊ทธ๋ฌํจ์ผ๋ก์ ์๋ธํด๋์ค์ ๋
๋ฆฝ์ฑ๊ณผ Portability๋ฅผ ์ฆ์ง์ํจ๋ค.
- ์๋ธ์์คํ
์ ๊ณ์ธต์ ๋๊ณ ์ถ์ ๋. ๊ฐ ์๋ธ์์คํ
๋ ๋ฒจ์ entry point๋ฅผ ์ ์ํ๊ธฐ ์ํด facade๋ฅผ ์ฌ์ฉํ๋ผ. ๋ง์ผ ๊ฐ ์๋ธ์์คํ
๋ค์ด ์๋ก ์์กด์ ์ด๋ผ๋ฉด ์๋ธ์์คํ
๋ค๊ฐ์ ๋ํ๋ฅผ ๊ฐ ์์คํ
๊ฐ์ facade๋ก ๋จ์ผํ ์ํด์ผ๋ก์ ๊ทธ ์์กด์ฑ์ ๋จ์ํ์ํฌ ์ ์๋ค.
1.4. Participant ¶
Facade (Compiler)
- ๊ฐ ์๋ธ์์คํ
ํด๋์ค๋ ๊ฐ ์์ฒญ์ ๋ํ ์ฑ
์์ด ์๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ํฉํ ์๋ธ์์คํ ๊ฐ์ฒด์๊ฒ ์์ํ๋ค.
subsystem classes (Scanner, Parser, ProgramNode, etc.)- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ํฉํ ์๋ธ์์คํ ๊ฐ์ฒด์๊ฒ ์์ํ๋ค.
- ์๋ธ์์คํ
๊ธฐ๋ฅ๋ค์ด ๊ตฌํ๋์ด์๋ค.
- Facade ๊ฐ์ฒด์ ์ํด ์ ์๋ ์์ ์ ์ฒ๋ฆฌํ๋ค.
- facade ์ ๋ํ ์ ๋ณด๊ฐ ํ์์๋ค. facade object์ ๋ํ reference๋ฅผ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ค.
- Facade ๊ฐ์ฒด์ ์ํด ์ ์๋ ์์ ์ ์ฒ๋ฆฌํ๋ค.
- facade ์ ๋ํ ์ ๋ณด๊ฐ ํ์์๋ค. facade object์ ๋ํ reference๋ฅผ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ค.
1.5. Collaborations ¶
- ํด๋ผ์ด์ธํธ๋ Facade์๊ฒ ์์ฒญ์ ๋ณด๋์ผ๋ก์ ์๋ธ์์คํ
๊ณผ ๋ํํ๋ค. Facade ๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ํฉํ ์๋ธ์์คํ
๊ฐ์ฒด์๊ฒ ๋๊ธด๋ค. ๋น๋ก ์๋ธ์์คํ
๊ฐ์ฒด๊ฐ ์ค์ ์์
์ ์ํํ์ง๋ง, facade ๋ facade ์ ์ธํผํ์ด์ค๋ฅผ ์๋ธ์์คํ
์ ์ธํฐํ์ด์ค๋ก ๋ฒ์ญํ๊ธฐ ์ํ ๊ณ ์ ์ ์์
์ ํด์ผ ํ ๊ฒ์ด๋ค.
facade ๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์ง์ ์๋ธ์์คํ ๊ฐ์ฒด์ ์ ๊ทผํ ํ์๊ฐ ์๋ค.
1.6. Consequences ¶
Facade Pattern์ ๋ค์๊ณผ ๊ฐ์ ์ด์ต์ ์ ๊ณตํด์ค๋ค.
- ์๋ธ์์คํ
์ปดํฌ๋ํธ๋ก๋ถํฐ ํด๋ผ์ด์ธํธ๋ค์ ๋ณดํธํ๋ค. ๊ทธ๋ฌํจ์ผ๋ก์ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฃจ๋ ๊ฐ์ฒด์ ์๋ฅผ ์ค์ด๊ณ , ์๋ธ์์คํ
์ ์ด์ฉํ๊ธฐ ์ฝ๊ฒ ํด์ค๋ค.
- ์๋ธ์์คํ
๊ณผ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ์ฝํ๊ฒ ํด์ค๋ค. ์ข
์ข
์๋ธ์์คํ
์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ์ ๊ฐํ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ธฐ๋ ํ๋ค. ์ฝํ ์ฐ๊ฒฐ๊ด๊ณ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉด์ ์๋ธ์์คํ
์ ์ปดํฌ๋ํธ๋ค์ ๋ค์ํ๊ฒ ๋ง๋ค์ด์ค๋ค. Facade ๋ ์์คํ
๊ณผ ๊ฐ์ฒด๊ฐ์ ์์กด์ฑ์ ๊ณ์ธตํ ํ๋๋ฐ ๋์์ ์ค๋ค. Facade๋ ๋ณต์กํจ์ด๋ ์ํ์์กด์ฑ์ ์์ ์ค๋ค. ์ด๊ฒ์ ํดํด๋ผ์ด์ธํธ์ ์๋ธ์์คํ
์ด ๋น์์กด์ ์ผ๋ก ๊ตฌํ๋์์๋์ ๊ฐ์ฅ ์ค์ํ ๊ฒฐ๊ณผ์ผ ๊ฒ์ด๋ค.
- ๊ทธ๋ฌํ๋ฉด์๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ ํ ์์ค์์คํ
ํด๋์ค๋ค์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ฌ์ฉ์ ํธ๋ฆฌ์ฑ๊ณผ ์ผ๋ฐ์ฑ์ ์ ํํ ์ ์๋ค.
1.7. Implementation ¶
facade๋ฅผ ๊ตฌํํ ๋ ๋ค์๊ณผ ๊ฐ์ issue๋ฅผ ์๊ฐํ๋ผ.
๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ถ์ Facade class์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ธ์์คํ ๊ณผ ๋ํํ ์ ์๋ค. ์ด๋ฌํ ์ถ์ํด๋์ค์์ ์ฐ๊ฒฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์๋ธ์์คํ ์ ๊ตฌํ์ ์์์ผ ํ๋ ํ์์ฑ์ ์์ ์ค๋ค.
์๋ธ์์คํ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ค๋ ์ ๊ณผ ๋ฌด์์ธ๊ฐ๋ฅผ (ํด๋์ค๋ state์ operation์ ์บก์ํํ๋ ๋ฐ๋ฉด, ์๋ธ์์คํ ์ classes๋ฅผ ์บก์ํํ๋ค.) ์บก์ํํ๋ค๋ ์ ์์ class ์ ๋น์ทํ๋ค. class ์์ public ๊ณผ private interface๋ฅผ ์๊ฐํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์๋ธ์์คํ ์์ public ๊ณผ private interface ์ ๋ํด ์๊ฐํ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ-์๋ธ์์คํ
์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ์ค์ฌ๋ผ.
๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ถ์ Facade class์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ธ์์คํ ๊ณผ ๋ํํ ์ ์๋ค. ์ด๋ฌํ ์ถ์ํด๋์ค์์ ์ฐ๊ฒฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์๋ธ์์คํ ์ ๊ตฌํ์ ์์์ผ ํ๋ ํ์์ฑ์ ์์ ์ค๋ค.
์๋ธํด๋์ฑ์ ๋์ฒด๋ ๋ค๋ฅธ ์๋ธ์์คํ
๊ฐ์ฒด๋ฅผ ๊ฐ์ง Facade ๊ฐ์ฒด๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. facade๋ฅผ ์ปค์คํฐ๋ง์ด์ฆํ๋ ค๋ฉด ๋จ์ํ ์๋ธ์์คํ
๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๊ตํํ๋ค.
2. public vs private ์๋ธ์์คํ
ํด๋์ค. ์๋ธ์์คํ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ค๋ ์ ๊ณผ ๋ฌด์์ธ๊ฐ๋ฅผ (ํด๋์ค๋ state์ operation์ ์บก์ํํ๋ ๋ฐ๋ฉด, ์๋ธ์์คํ ์ classes๋ฅผ ์บก์ํํ๋ค.) ์บก์ํํ๋ค๋ ์ ์์ class ์ ๋น์ทํ๋ค. class ์์ public ๊ณผ private interface๋ฅผ ์๊ฐํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์๋ธ์์คํ ์์ public ๊ณผ private interface ์ ๋ํด ์๊ฐํ ์ ์๋ค.
์๋ธ์์คํ
์ผ๋ก์ public interface๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค์ด ์ ์๊ฐ๋ฅํ ํด๋์ค๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ. ์ด๋ ์๋ธ์์คํ
์ผ๋ก์ private interface๋ ๋จ์ง ์๋ธ์์คํ
์ ํ์ฅ์๋ค์ ์ํ ์ธํฐํ์ด์ค์ด๋ค. ๋ฐ๋ผ์ facade class๋ public interface์ ์ผ๋ถ์ด๋ค. ํ์ง๋ง, ์ ์ผํ ์ผ๋ถ์ธ ๊ฒ์ ์๋๋ค. ๋ค๋ฅธ ์๋ธ์์คํ
ํด๋์ค๋ค ์ญ์ ๋๊ฒ public interface์ด๋ค. ์๋ฅผ ๋ค์๋ฉด, ์ปดํ์ผ๋ฌ ์๋ธ์์คํ
์ Parser class๋ Scanner class๋ค์ public interface์ ์ผ๋ถ์ด๋ค.
์๋ธ์์คํ ํด๋์ค๋ฅผ private ๋ก ๋ง๋๋ ๊ฒ์ ์ ์ฉํ์ง๋ง, ์ผ๋ถ์ OOP Language๊ฐ ์ง์ํ๋ค. C++๊ณผ Smalltalk ๋ ์ ํต์ ์ผ๋ก class์ ๋ํ namespace๋ฅผ globalํ๊ฒ ๊ฐ์ง๋ค. ํ์ง๋ง ์ต๊ทผ์ C++ ํ์คํ์์์ namespace๊ฐ ์ถ๊ฐ๋จ์ผ๋ก์ Str94, public ์๋ธ์์คํ ํด๋์ค๋ฅผ ๋ ธ์ถ์ํฌ ์ ์๊ฒ ๋์๋ค.Str94 (์ถฉ๋์ ์ฌ์ง๋ฅผ ์ค์๋ค๋ ํธ์ด ๋ง์๋ฏ..)
์๋ธ์์คํ ํด๋์ค๋ฅผ private ๋ก ๋ง๋๋ ๊ฒ์ ์ ์ฉํ์ง๋ง, ์ผ๋ถ์ OOP Language๊ฐ ์ง์ํ๋ค. C++๊ณผ Smalltalk ๋ ์ ํต์ ์ผ๋ก class์ ๋ํ namespace๋ฅผ globalํ๊ฒ ๊ฐ์ง๋ค. ํ์ง๋ง ์ต๊ทผ์ C++ ํ์คํ์์์ namespace๊ฐ ์ถ๊ฐ๋จ์ผ๋ก์ Str94, public ์๋ธ์์คํ ํด๋์ค๋ฅผ ๋ ธ์ถ์ํฌ ์ ์๊ฒ ๋์๋ค.Str94 (์ถฉ๋์ ์ฌ์ง๋ฅผ ์ค์๋ค๋ ํธ์ด ๋ง์๋ฏ..)
Sample Code
์, Compiler ์๋ธ์์คํ ์ ์ด๋ป๊ฒ facade๊ฐ ์ ํ์ง๋์ง ์์ธํ ๋ณด๋๋ก ํ์.
์, Compiler ์๋ธ์์คํ ์ ์ด๋ป๊ฒ facade๊ฐ ์ ํ์ง๋์ง ์์ธํ ๋ณด๋๋ก ํ์.
Compiler ์๋ธ์์คํ
์ BytecodeStream ํด๋์ค๋ฅผ ์ ์ํ๋ค. ์ด ํด๋์ค๋ Bytecode ๊ฐ์ฒด์ ์คํธ๋ฆผ๋ถ๋ฅผ ๊ตฌํํ๋ค. Bytecode ๊ฐ์ฒด๋ ๋จธ์ ์ฝ๋๋ฅผ ๊ตฌ์ฒดํํ๋ bytecode๋ฅผ ์บก์ํํ๋ค. ์๋ธ์์คํ
์ ๋ํ Token ํด๋์ค๋ฅผ ์ ์ํ๋๋ฐ, Token ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ ์ธ์ด๋ด์ token๋ค์ ์บก์ํํ๋ค.
Scanner ํด๋์ค๋ character ์คํธ๋ฆผ์ ์ป์ด์ token์ ์คํธ๋ฆผ์ ๋ง๋ ๋ค.
class Scanner { public: Scanner (istream&); virtual ~Scanner (); virtual Token& Scan (); private: istream& _inputStream; };
Parser ํด๋์ค๋ Scanner์ token๋ก parse tree๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ProgramNodeBuilder ๋ฅผ ์ฌ์ฉํ๋ค.
class Parser { public: Parser (); virtual ~Parser (); virtual void Parse (Scanner&, ProgramNodeBuilder &); };
Parser๋ ์ ์ง์ ์ผ๋ก parse tree๋ฅผ ๋ง๋ค๊ธฐ ์ํด ProgramNodeBuilder ๋ฅผ ํธ์ถํ๋ค. ์ด ํด๋์ค๋ค์ Builder pattern์ ๋ฐ๋ผ ์ํธ์์ฉํ๋ค.
class ProgramNodeBuilder { public: ProgramNodeBuilder (); virtual ProgramNode* NewVariable ( const char* variableName ) const; virtual ProgramNode* NewAssignment ( ProgramNode* variable, ProgramNode* expression ) const; virtual ProgramNode* NewRetrunStatement ( ProgramNode* value ) const; virtual ProgramNode* NewCondition ( ProgramNode* condition, ProgramNode* truePart, ProgramNode* falsePart ) const; // ... ProgramNode* GetRootNode (); private: ProgramNode* _node; };
parser tree๋ StatementNode, ExpressionNode์ ๊ฐ์ ProgramNode์ subclass๋ค์ ์ธ์คํด์ค๋ค๋ก ์ด๋ฃจ์ด์ง๋ค. ProgramNode ๊ณ์ธต ๊ตฌ์กฐ๋ Composite Pattern์ ์์ด๋ค. ProgramNode๋ program node ์ program node์ children์ ์กฐ์ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค.
class ProgramNode { public: // program node manipulation virtual void GetSourcePosition (int& line, int& index); // ... // child manipulation virtual void Add (ProgramNode*); virtual void Remove (ProgramNode*); // ... virtual void Traverse (CodeGenerator&); protected: ProgramNode (); };
Traverse operaton์ CodeGenerator ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ทจํ๋ค. ProgramNode subclass๋ค์ BytecodeStream์ ์๋ Bytecode๊ฐ์ฒด๋ค์ machine code๋ก ๋ณํํ๊ธฐ ์ํด CodeGenerator ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค. CodeGenerator ํด๋๋ visitor์ด๋ค. (VisitorPattern์ ์ฐธ์กฐํ๋ผ)
class CodeGenerator { public: virtual void Visit (StatementNode*); virtual void Visit (ExpressionNode*); // ... protected: CodeGenerator (BytecodeStream&); protected: BytecodeStream& _output; };
CodeGenerator ๋ subclass๋ฅผ ๊ฐ์ง๋ค. ์๋ฅผ๋ค์ด StackMachineCodeGenerator sk RISCCodeGenerator ๋ฑ. ๊ฐ๊ฐ์ ๋ค๋ฅธ ํ๋์จ์ด ์ํคํ
์ฒ์ ๋ํ machine code๋ก ๋ณํํ๋ subclass๋ฅผ ๊ฐ์ง ์ ์๋ค.
ProgramNode์ ๊ฐ subclass๋ค์ ProgramNode์ child์ธ ProgramNode ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ธฐ ์ํด Traverse operation์ ๊ตฌํํ๋ค. ๋งค๋ฒ ๊ฐ child๋ children์๊ฒ ๊ฐ์ ์ผ์ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ค. ์๋ฅผ ๋ค์ด, ExpressionNode๋ Traverse๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
void ExpressionNode::Traverse (CodeGenerator& cg) { cg.Visit (this); ListIterator <ProgramNode*> i (_children); for (i.First (); !i.IsDone (); i.Next ()) { i.CurrentItem ()->Traverse (cg); } }
์ฐ๋ฆฌ๊ฐ ํ ๋ก ํด์จ ํด๋์ค๋ค์ ๊ณง Compiler ์๋ธ์์คํ
์ ์ด๋ฃฐ ๊ฒ์ด๋ค. ์ ์ด์ ์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ์กฐ๊ฐ๋ค์ ํจ๊ป ๋ฌถ์ facade ์ธ Compiler ํด๋์ค๋ฅผ ์๊ฐํ ๊ฒ์ด๋ค. Compiler๋ ์์ค ์ปดํ์ผ๊ณผ ํน์ machine์ ๋ํ ์ฝ๋๋ณํ๊ธฐ๋ฅ์ ๋ํ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
class Compiler { public: Compiler (); virtual void Compile (istream&, BytecodeStream&); }; void Compiler::Compile ( istream& input, BytecodeStream& output ) { Scanner scanner (input); ProgramNodeBuilder builder; Parser parser; parser.Parse (scanner, builder); RISCCodeGenerator generator (output); ProgramNode* parseTree = builder.GetRootNode (); parseTree->Traverse (generator); }
์ด ๊ตฌํ์์๋ ์ฌ์ฉํ๋ ค๋ code-generator์ ํํ์ ๋ํด์ hard-codes (์ง์ ํน์ ํํ ๋ถ๋ถ์ ์ถ์ํ์ํค์ง ์๊ณ ๋ฐ๋ก ์
๋ ฅ)๋ฅผ ํ๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์ ํ๋ก๊ทธ๋๋จธ๋ ๋ชฉ์ ์ด ๋๋ ์ํคํ
์ฒ๋ก ๊ตฌ์ฒดํ์ํค๋๋ก ์๊ตฌ๋ฐ์ง ์๋๋ค. ๋ง์ผ ๋ชฉ์ ์ด ๋๋ ์ํคํ
์ฒ๊ฐ ๋จ ํ๋๋ผ๋ฉด ๊ทธ๊ฒ์ ์๋ง ์ด์ฑ์ ์ธ ํ๋จ์ผ ๊ฒ์ด๋ค. ๋ง์ผ ๊ทธ๋ฌํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ฐ๋ฆฌ๋ Compiler ์ constructor ์ CodeGenerator ๋ฅผ ์ธ์๋ก ์ถ๊ฐํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋๋จธ๋ Compiler๋ฅผ instanceํ ํ ๋ ์ฌ์ฉํ generator๋ฅผ ๊ตฌ์ฒดํํ ์ ์๋ค. Compiler facade๋ ๋ํ Scanner๋ ProgramNodeBuilder ๋ฑ์ ๋ค๋ฅธ ํ๋ํ๋ ์๋ธ์์คํ
ํด๋์ค๋ฅผ ์ธ์ํํ ์ ์๋ค. ๊ทธ๊ฒ์ ์ ์ฐ์ฑ์ ์ฆ๊ฐ์ํค์ง๋ง, ๋ํ ์ผ๋ฐ์ ์ธ ์ฌ์ฉํํ์ ๋ํด ์ธํฐํ์ด์ค์ ๋จ์ํจ์ ์ ๊ณตํ๋ Facade pattern์ ์์๋ฅผ ๋จ์ด๋จ๋ฆฐ๋ค.
1.8. Known Uses ¶
Sample Code์ compiler ์ ์๋ ObjectWorksSmalltalk compiler system์์ ์๊ฐ์ ์ป์ ๊ฒ์ด๋ค.Par90
ET++ application framework WGM88 ์์, application์ run-time ์์์ application์ ๊ฐ์ฒด๋ค์ ์ดํ ์ ์ ์๋ built-in browsing tools๋ฅผ ๊ฐ์ง๊ณ ์๋ค.์ด๋ฌํ browsing tools๋ "ProgrammingEnvironment'๋ผ ๋ถ๋ฆฌ๋ facade class๋ฅผ ๊ฐ์ง ๊ตฌ๋ถ๋ ์๋ธ์์คํ ์ ๊ตฌํ๋์ด์๋ค. ์ด facade๋ browser์ ์ ๊ทผ ํ๊ธฐ ์ํ InspectObject๋ InspectClass๊ฐ์ operation์ ์ ์ํ๋ค.
ET++ application์ ๋ํ built-in browsing support๋ฅผ ์์จ์๋ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ProgrammingEnvironment๋ ์ด ์์ฒญ์ ๋ํด null-operation์ผ๋ก์ ๊ตฌํํ๋ค. ๊ทธ๋ฌํ null-operation๋ ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค. ๋จ์ง ETProgrammingEnvironment subclass๋ ๊ฐ๊ฐ ๋์ํ๋ browser์ ํ์ํด์ฃผ๋ operation์ ๊ฐ์ง๊ณ ์ด๋ฌํ ์์ฒญ์ ๊ตฌํํ๋ค. application์ browsing environment๊ฐ ์กด์ฌํ๋์ง ๊ทธ๋ ์ง ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. application ๊ณผ browsing ์๋ธ์์คํ ์ฌ์ด์๋ ์ถ์์ ์ธ ๊ฒฐํฉ๊ด๊ณ๊ฐ ์๋ค.
ET++ application framework WGM88 ์์, application์ run-time ์์์ application์ ๊ฐ์ฒด๋ค์ ์ดํ ์ ์ ์๋ built-in browsing tools๋ฅผ ๊ฐ์ง๊ณ ์๋ค.์ด๋ฌํ browsing tools๋ "ProgrammingEnvironment'๋ผ ๋ถ๋ฆฌ๋ facade class๋ฅผ ๊ฐ์ง ๊ตฌ๋ถ๋ ์๋ธ์์คํ ์ ๊ตฌํ๋์ด์๋ค. ์ด facade๋ browser์ ์ ๊ทผ ํ๊ธฐ ์ํ InspectObject๋ InspectClass๊ฐ์ operation์ ์ ์ํ๋ค.
ET++ application์ ๋ํ built-in browsing support๋ฅผ ์์จ์๋ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ProgrammingEnvironment๋ ์ด ์์ฒญ์ ๋ํด null-operation์ผ๋ก์ ๊ตฌํํ๋ค. ๊ทธ๋ฌํ null-operation๋ ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค. ๋จ์ง ETProgrammingEnvironment subclass๋ ๊ฐ๊ฐ ๋์ํ๋ browser์ ํ์ํด์ฃผ๋ operation์ ๊ฐ์ง๊ณ ์ด๋ฌํ ์์ฒญ์ ๊ตฌํํ๋ค. application์ browsing environment๊ฐ ์กด์ฌํ๋์ง ๊ทธ๋ ์ง ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. application ๊ณผ browsing ์๋ธ์์คํ ์ฌ์ด์๋ ์ถ์์ ์ธ ๊ฒฐํฉ๊ด๊ณ๊ฐ ์๋ค.
Choices operating system CIRM93 ์ ๋ง์ framework๋ฅผ ํ๋๋ก ํฉ์น๊ธฐ ์ํด facade๋ฅผ ์ฌ์ฉํ๋ค. Choices์์์ key๊ฐ ๋๋ ์ถ์๊ฐ์ฒด๋ค์ process์ storge, ๊ทธ๋ฆฌ๊ณ adress spaces ์ด๋ค. ์ด๋ฌํ ๊ฐ ์ถ์๊ฐ์ฒด๋ค์๋ ๊ฐ๊ฐ์ ๋์๋๋ ์๋ธ์์คํ
์ด ์์ผ๋ฉฐ, framework๋ก์ ๊ตฌํ๋๋ค. ์ด framework๋ ๋ค์ํ ํ๋์จ์ด ํ๋ซํผ์ ๋ํด Choices์ ๋ํ porting์ ์ง์ํ๋ค. ์ด ๋ ์๋ธ์์คํ
์ '๋ํ์'๋ฅผ ๊ฐ์ง๋ค. (์ฆ, facade) ์ด ๋ํ์๋ค์ FileSystemInterface (storage) ์ Domain (address spaces)์ด๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ framework๋ Domain์ facade๋ก์ ๊ฐ์ง๋ค. Domain์ address space๋ฅผ ๋ํ๋ธ๋ค. Domain์ virtual addresses ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด, ํ์ผ, ์ ์ฅ์์ offset์ ๋งคํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. Domain์ main operation์ ํน์ ์ฃผ์์ ๋ํด ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์ญ์ ํ๋๊ฐ page fault๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์์ ๋ค์ด์ด๊ทธ๋จ์ด ๋ณด์ฌ์ฃผ๋ฏ, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์๋ธ์์คํ
์ ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ๋ค.
- MemoryObject ๋ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๋ํ๋ธ๋ค.
- MemoryObjectCache๋ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์์์ MemoryObject์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฌํ๋ค.
MemoryObjectCache๋ ์ค์ ๋ก๋ ์บ์ฌ ์ ์ฑ ์ ์ง์ญํ์ํค๋ Strategy Pattern์ด๋ค.
- AddressTranslation ์ address translation hardware ๋ฅผ ์บก์ํํ๋ค.
RepairFault ๋ช ๋ น์ page fault ์ธํฐ๋ฝํธ๊ฐ ์ผ์ด๋ ๋ ํธ์ถ๋๋ค. Domain์ fault ๋ฅผ ์ผ๊ธฐ์ํจ ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ์ฒด๋ฅผ ์ฐพ์๋ค RepairFault์ ๋ฉ๋ชจ๋ฆฌ๊ฐ์ฒด๊ณผ ๊ด๊ณ๋ ์บ์ฌ๋ฅผ ์์ํ๋ค. Domain๋ค์ ์ปดํฌ๋ํธ๋ฅผ ๊ต์ฒดํจ์ผ๋ก์ ์ปค์คํฐ๋ง์ด์ฆ๋ ์ ์๋ค.
1.9. Related Patterns ¶
AbstactFactory ๋ Facade๊ตฌํ์ ์๋ธ์์คํ
๋
๋ฆฝ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์๋ธ์์คํ
๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. Abstract Factory๋ ๋ํ ํ๋ซํผ ๋น๋
๋ฆฝ์ ํด๋์ค๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด Facade์ ๋์์ผ๋ก์ ์ฌ์ฉํ ์ ์๋ค.
Mediator ๋ ์กด์ฌํ๋ class๋ค์ ๊ธฐ๋ฅ๋ค์ ์ถ์ํ์ํจ๋ค๋ ์ ์์ Facade์ ๋น์ทํ๋ค. ํ์ง๋ง Mediator์ ๋ชฉ์ ์ ์ ํด์ง์ง ์์ ๋๋ฃํด๋์ค๊ฐ์ ํต์ ์ ์ถ์ํ์ํค๊ณ , ํด๋น ๋๋ฃํด๋์ค๊ตฐ ์ด๋์๋ ํฌํจ๋์ง ์๋ ๊ธฐ๋ฅ๋ค์ ์ค์์ผ๋ก ๋ชจ์๋ค. Mediator์ ๋๋ฃํด๋์ค๋ค์ Mediator์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ฉฐ ์๋ก ์ง์ ์ ์ผ๋ก ํต์ ํ๋ ๋์ mediator๋ฅผ ํตํด ํต์ ํ๋ค. ๋์กฐ์ ์ผ๋ก facade๋ ๋จ์ง ์๋ธ์์คํ
๋ค์ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ํ๊ธฐ ์ํด์ ์๋ธ์์คํ
๋ค์ ์ธํฐํ์ด์ค๋ฅผ ์ถ์ํ์ํฌ ๋ฟ์ด๋ค. facade๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์๋ก ์ ์ํ์ง ์์ผ๋ฉฐ, ์๋ธ์์คํ
ํด๋์ค๋ facade์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ํ์๊ฐ ์๋ค.
๋ณดํต facade๋ ๋จ์ผ ์ค๋ธ์ ํธ๋ก ์๊ตฌ๋๋ค. ๊ทธ๋์Facade ๊ฐ์ฒด๋ ์ข
์ข
SingletonPattern์ผ๋ก ๊ตฌํ๋๋ค.