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μΌλ‘ ꡬνλλ€.