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.0481 sec