U E D R , A S I H C RSS

Gof/Facade

From GoF.


1. FACADE

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๋ฅผ ฐ€ง€  žˆ„ •„š”ฐ€ —†๋‹ค.

1.5. Collaborations

  • ด๋–ธŠธ๋Š” Facade—ฒŒ š”ฒญ„ ๋ณด๋ƒ„œผ๋กœ„œ „œ๋ธŒ‹œŠค…œณผ ๋Œ€™”•œ‹ค. Facade ฒด๋Š” ด๋–ธŠธ˜ š”ฒญ„  ••œ „œ๋ธŒ‹œŠค…œ ฒด—ฒŒ ๋„˜ธด๋‹ค. ๋น„๋ก „œ๋ธŒ‹œŠค…œ ฒดฐ€ ‹ œ ž‘—…„ ˆ˜–‰•˜ง€๋งŒ, facade ๋Š” facade ˜ ผŽ˜Šค๋ฅผ „œ๋ธŒ‹œŠค…œ˜ „Ž˜Šค๋กœ ๋ฒˆ—ญ•˜ธฐ œ„•œ  œ ˜ ž‘—…„ •••  ฒƒด๋‹ค.
    facade ๋ฅผ ‚ฌšฉ•˜๋Š” ด๋–ธŠธ๋Š” ง ‘ „œ๋ธŒ‹œŠค…œ ฒด—  ‘•  •„š”ฐ€ —†๋‹ค.

1.6. Consequences

Facade Pattern€ ๋‹Œณผ ฐ™€ „  œณต•ค€๋‹ค.
  1. „œ๋ธŒ‹œŠค…œ ปดฌ๋„ŒŠธ๋กœ๋ถ€„ด๋–ธŠธ๋“ค„ ๋ณด˜•œ‹ค. ธ๋Ÿฌ•œผ๋กœ„œ ด๋–ธŠธฐ€ ๋‹ค๋ฃจ๋Š” ฒด˜ ˆ˜๋ฅผ „ , „œ๋ธŒ‹œŠค…œ„ šฉ•˜ธฐ ‰ฝฒŒ •ค€๋‹ค.
  2. „œ๋ธŒ‹œŠค…œณผ ด๋–ธŠธ „˜ —ฐฒฐด€„๋ฅผ ••˜ฒŒ •ค€๋‹ค. ข…ข… „œ๋ธŒ‹œŠค…œ ปดฌ๋„ŒŠธ๋Š” ด๋–ธŠธ™€ ••œ —ฐฒฐด€„๋ฅผ ฐ€ง€ธฐ๋„ •œ‹ค. ••œ —ฐฒฐด€„๋Š” ด๋–ธŠธ—ฒŒ ˜–ฅ„ ๋ฏธ˜ง€ •Šœผ๋ฉด„œ „œ๋ธŒ‹œŠค…œ˜ ปดฌ๋„ŒŠธ๋“ค„‹–‘•˜ฒŒ ๋งŒ๋“ค–ดค€๋‹ค. Facade ๋Š” ‹œŠค…œณผ ฒด„˜ ˜กด„„ „ธต™” •˜๋Š”๋ฐ ๋„›€„ ค€๋‹ค. Facade๋Š” ๋ณตžก•ด๋‚˜ ˆœ™˜˜กด„„ —†• ค€๋‹ค. ฒƒ€ ดด๋–ธŠธ™€ „œ๋ธŒ‹œŠค…œด ๋น„˜กด œผ๋กœ ตฌ˜„๋˜—ˆ„•Œ˜ ฐ€žฅ ‘š”•œ ฒฐณผฒƒด๋‹ค.
  3. ธ๋Ÿฌ•˜๋ฉด„œ๋„ –ด”Œ๋ฆฌผ€…˜€ —ฌ „žˆ „œŠค‹œŠค…œ ด๋ž˜Šค๋“ค„ ‚ฌšฉ•  ๋ฐฉ๋ฒ•„  œณต•œ‹ค. ‚ฌšฉ˜ Žธ๋ฆฌ„ณผ ผ๋ฐ˜„„ „ ƒ•  ˆ˜ žˆ๋‹ค.

1.7. Implementation

facade๋ฅผ ตฌ˜„• •Œ ๋‹Œณผ ฐ™€ issue๋ฅผ ƒฐ•˜ผ.
  1. ด๋–ธŠธ-„œ๋ธŒ‹œŠค…œ —ฐฒฐด€„๋ฅผ „—ฌ๋ผ.
ด๋–ธŠธ™€ „œ๋ธŒ‹œŠค…œ„˜ —ฐฒฐด€„๋Š” Facade๋ฅผ ถ”ƒด๋ž˜Šค๋กœ ๋งŒ๋“ฌœผ๋กœ„œ „ˆ˜ žˆ๋‹ค.
ธ๋Ÿฌ๋ฉด ด๋–ธŠธ๋Š” ถ”ƒ 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 (ถฉ๋Œ˜ —ฌง€๋ฅผ „˜€๋‹ค๋Š” Žธด ๋งž„๋“ฏ..)

Sample Code
ž, 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 „œ๋ธŒ‹œŠค…œ ‚ฌ—๋Š” ถ”ƒ ฒฐ•ด€„ฐ€ žˆ๋‹ค.

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œผ๋กœ ตฌ˜„๋œ‹ค.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0467 sec