рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВред рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореЗрд░реЗ рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдиреЗ рдПрдХ рдмрдбрд╝реА рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдкреИрджрд╛ рдХреАред рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рдереАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрддреНрд░ рдорд┐рд▓реЗ, рдФрд░ рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдиреЗ рдЦреБрд▓реЗ рдмрдпрд╛рди рднреА рджрд┐рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдФрд░ рд╣рдмрд░ рдкрд░ рдореБрдЭ рдкрд░ рд╣реБрдП рд╣рдорд▓реЗ рдкреВрд░реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрджреНрджреЗ рдХреА рдЦреВрдмрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ "рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдХрдВрдкрдиреА рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ред" рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛: (i) рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ (ii), рдПрдХ рдЕрд░реНрде рдореЗрдВ, IFIF- рдореБрдХреНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рджрд╛рд░реНрд╢рдирд┐рдХ рд╡рд┐рдЪрд╛рд░ред рдХрд╛рдлреА рдХреБрдЫ рдкрддреНрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рд▓реЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рд╡реЗ рдЖрдзреЗ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд : рдпрд╣ рд╡рд┐рд╖рдп (рдФрд░ рд╕рд╛рде рд╣реА рдЕрдВрддрд┐рдо рдПрдХ) рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдореБрджреНрджреЛрдВ рдкрд░ рдЕрдЯрдХрд▓реЗрдВ рд▓рдЧрд╛рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдХреЛрдИ рд╕рдмрдЯреЗрдХреНрд╕реНрдЯ, рд╣рд┐рдВрдЯ, рдХреЙрд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдФрд░ рд╕рд╛рдЬрд┐рд╢ рдХреЗ рд╕рдорд░реНрдердХреЛрдВ рдХреЛ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред



рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдкреНрд░рд╢реНрди 4 рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред



рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИред рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХреА рддрд╛рдХрд┐ рд╡рд╣ рдЬрд╛ рд░рд╣реЗ рдереЗ



#include <string> #include <stdexcept> #include <iostream> class CodeGenerator { public: enum Lang {JAVA, C_PLUS_PLUS, PHP}; CodeGenerator(Lang language) { _language=language; } std::string generateCode() { switch(_language) { case JAVA: return std::string("Java: System.out.println(\"Hello world!\");"); case C_PLUS_PLUS: return std::string("C++: std::cout << \"Hello world!\";"); } throw new std::logic_error("Bad language"); } std::string someCodeRelatedThing() // used in generateCode() { switch(_language) { case JAVA: return std::string("http://www.java.com/"); case C_PLUS_PLUS: return std::string("http://www.cplusplus.com/doc/tutorial/"); } throw new std::logic_error("Bad language"); } private: Lang _language; }; int main() { CodeGenerator cg(CodeGenerator::JAVA); std::cout << cg.generateCode() << "\tMore info: " << cg.someCodeRelatedThing() << std::endl; CodeGenerator ec(CodeGenerator::PHP); try { ec.generateCode(); } catch (std::logic_error * e) { std::cout << "ERROR: " << e->what() << std::endl; } return 0; }
      
      





рдЖрдЗрдП рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд╕реЗ рдХреНрдпрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдХреНрд╖рд░ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рд╕рд░рд▓ рд╣реИрдВ рдФрд░, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкреЗрдп рдХреЛ рдбрд╛рд▓реЗрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред



рдлреВрдЯ рдбрд╛рд▓реЛ рдФрд░ рд░рд╛рдЬ рдХрд░реЛ



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИрдВред рд╣рдордиреЗ рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред



 #include <string> #include <stdexcept> #include <iostream> class CodeGeneratorJavaProcessor { public: std::string code() { return std::string("Java: System.out.println(\"Hello world!\");"); } std::string thing() { return std::string("http://www.java.com/"); } }; class CodeGeneratorCppProcessor { public: std::string code() { return std::string("C++: std::cout << \"Hello world!\";"); } std::string thing() { return std::string("http://www.cplusplus.com/doc/tutorial/"); } }; class CodeGenerator { public: enum Lang {JAVA, C_PLUS_PLUS, PHP}; CodeGenerator(Lang language) { _language=language; } std::string generateCode() { switch(_language) { case JAVA: return CodeGeneratorJavaProcessor().code(); case C_PLUS_PLUS: return CodeGeneratorCppProcessor().code(); } throw new std::logic_error("Bad language"); } std::string someCodeRelatedThing() { switch(_language) { case JAVA: return CodeGeneratorJavaProcessor().thing(); case C_PLUS_PLUS: return CodeGeneratorCppProcessor().thing(); } throw new std::logic_error("Bad language"); } private: Lang _language; }; int main() { CodeGenerator cg(CodeGenerator::JAVA); std::cout << cg.generateCode() << "\tMore info: " << cg.someCodeRelatedThing() << std::endl; CodeGenerator ec(CodeGenerator::PHP); try { ec.generateCode(); } catch (std::logic_error * e) { std::cout << "ERROR: " << e->what() << std::endl; } return 0; }
      
      





рд╣рдо рдЗрд╕ рд╡рд┐рд╢реБрджреНрдз рдпрд╛рдВрддреНрд░рд┐рдХ рд╕реБрдзрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯреЗрдВрдЧреЗред



рдПрдХреАрдХреГрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рд╕реНрд╡рд┐рдЪ рд╡рд┐рдлрд▓рддрд╛



рдЖрдЗрдП рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВред рдЕрдм рд╣рдо CodeGenerator рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛрдб рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рднрд╛рд╖рд╛ рдХреЛрдб рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред



 #include <string> #include <stdexcept> #include <iostream> class CodeGeneratorAbstractProcessor { public: virtual std::string code() = 0; virtual std::string thing() = 0; virtual ~CodeGeneratorAbstractProcessor() {} }; class CodeGeneratorJavaProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { return std::string("Java: System.out.println(\"Hello world!\");"); } std::string thing() { return std::string("http://www.java.com/"); } }; class CodeGeneratorCppProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { return std::string("C++: std::cout << \"Hello world!\";"); } std::string thing() { return std::string("http://www.cplusplus.com/doc/tutorial/"); } }; class CodeGeneratorBadProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { throw new std::logic_error("Bad language"); return std::string(); } std::string thing() { throw new std::logic_error("Bad language"); return std::string(); } }; class CodeGenerator { public: enum Lang {JAVA, C_PLUS_PLUS, PHP}; CodeGenerator(Lang language) : processor(0) { switch(language) { case JAVA: processor = new CodeGeneratorJavaProcessor(); break; case C_PLUS_PLUS: processor = new CodeGeneratorCppProcessor(); break; case PHP: processor = new CodeGeneratorBadProcessor(); break; } } ~CodeGenerator() { delete processor; } std::string generateCode() { return processor->code(); } std::string someCodeRelatedThing() { return processor->thing(); } private: CodeGeneratorAbstractProcessor * processor; }; int main() { CodeGenerator cg(CodeGenerator::JAVA); std::cout << cg.generateCode() << "\tMore info: " << cg.someCodeRelatedThing() << std::endl; CodeGenerator ec(CodeGenerator::PHP); try { ec.generateCode(); } catch (std::logic_error * e) { std::cout << "ERROR: " << e->what() << std::endl; } return 0; }
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдареАрдХ рдРрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдиреЛрдЯ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдЦрдХ рдХреЛ рд╕рдВрджреЗрд╣ рдерд╛ рдХрд┐ рдХреБрдЫ рдФрд░ рднреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдЪрд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВред



рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рдирдЬрд░рд┐рдпрд╛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ?



рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ CodeGenerator рдЕрдм рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдмрд╕ рджреЛ рдЪреАрдЬреЗрдВ:

рдХреНрдпрд╛ рд╣рдореЗрдВ рдРрд╕реЗ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:



 void i_like_to_convert_enum_to_lang(CodeGenerator::Lang lang_code) { CodeGenerator cg(lang_code); std::cout << cg.generateCode() << "\tMore info: " << cg.someCodeRelatedThing() << std::endl; }
      
      





рдпрд╣реА рд╣реИ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЬреАрд╡рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдирдо рдХреЛ рдЦреАрдВрдЪ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдЪрд╛рдирдХ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рднреА рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде: рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ / рд╣рдЯрд╛рдирд╛, рд╣рдорд╛рд░реЗ рдПрдирдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛ ... рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдирдо рдХреЛ рдПрдХ рдмрд╛рд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА? рдпрд╣ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рдХрдИ рдлрд╛рдпрджреЗ рджреЗрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдПрдХрд▓ рдкрд╛рд╕-рдереНрд░реВ рд╡рд╕реНрддреБ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреА рд╣реИ, рдХреБрдЫ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддреА рд╣реИ ... рдЖрдкрдХреЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреИрд╕рд╛ рд▓рдЧрд╛:



 void i_like_to_use_generators(CodeGeneratorAbstractProcessor * cg) { std::cout << cg->code() << "\tMore info: " << cg->thing() << std::endl; }
      
      





рдпрд╣рд╛рдБ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ CodeGenerator рдХреЛ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ред



рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рдХрджрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдлрд╛рдпрджреЗ рдорд┐рд▓реЗ!



рд╡реИрд╕реЗ (рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдЪрд░реНрдЪрд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП), рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рд╣рдордиреЗ _ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдмрдо рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрдо рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдЗрддрдиреЗ рдХрд░реАрдм рдЖ рдЧрдпрд╛ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмрд╣реБрд░реВрдкрд┐рдХ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред



рдФрд░ рдЕрдм рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред



<рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░>



рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╛рд╕реНрдХреЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг, рдЕрдЧрд░ рдФрд░ рдЕрдиреНрдп рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реЗрдирд╛рдирд┐рдпреЛрдВ рдХреЗ рдЙрддреНрд╕реБрдХ рдЖрдВрджреЛрд▓рди рд╣реИрдВред



рдЗрдлрд╝реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрдХреНрд░рдордг рдХреА рддрд░рд╣ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред



рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



 #include <iostream> #include <unistd.h> int main(int argc, char *argv[]) { //   ( ) bool debug(false); int r; while ((r = getopt(argc, argv, "d")) != -1) { switch ( r ){ case 'd': debug = true; break; } } //      , //     // ( ) if (debug) { std::cout << "Some debugging" << std::endl; } return 0; }
      
      





рдРрд╕реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг cdrtools, Python, git, cmake, m4 (debug variable), firefox (debug_mode), mpalyer / mencoder (рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░, рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ b_debug), x11vnc (debug / рдХреНрд░реИрд╢_debug / debug / debug / debug / debug / debug) рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред ... рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд┐рддреНрд░рдг рдорд┐рд▓реЗрдВрдЧреЗред



рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдЕрдЧрд░ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░, рдореБрдЦреНрдп рдХреЛрдб рдореЗрдВ, рдЗрд╕ рджреВрд╕рд░реА рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣рд░ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред



рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдореА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд! рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдХреЛрдб рдХреЗ рдЗрд╕ рд╕рднреА рдвреЗрд░ рдореЗрдВ рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреЛрдб рдХрд╛ рдпрд╣ рдЧреБрдЪреНрдЫрд╛ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред



рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдФрд░ рдЙрдкрд╛рдп рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ:



 #include <iostream> #include <unistd.h> class noout : public std::ostream {}; noout& operator<< (noout& out, const char* s) { return out; } int main(int argc, char *argv[]) { //       //    noout e; std::ostream *debug(&e); int r; while ((r = getopt(argc, argv, "d")) != -1) { switch ( r ){ case 'd': debug = &std::cout; break; } } //     *debug << "Some debugging" << std::endl; return 0; }
      
      





рдпрд╣рд╛рдВ, рд░реВрдкрд╛рдВрддрд░рдг рддреБрд░рдВрдд рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред



рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдореБрдЦреНрдп рдирд┐рдХрд╛рдп рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЕрдм рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



 #include <iostream> #include <unistd.h> class noout : public std::ostream {}; noout& operator<< (noout& out, const char* s) { return out; } int main(int argc, char *argv[]) { //     //      noout e; std::ostream *debug(&e); int r; while ((r = getopt(argc, argv, "de")) != -1) { switch ( r ){ case 'd': debug = &std::cout; break; case 'e': debug = &std::cerr; break; } } //        //  ,     *debug << "Some debugging" << std::endl; return 0; }
      
      





рдмреЗрд╢рдХ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛



 noout& operator<< (noout& out, const signed char* s); noout& operator<< (noout& out, const unsigned char* s); ...
      
      





рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рдмреЗрд╢рдХ, рдПрдХ рдкреВрд░реНрдг рд▓реЙрдЧрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдм рд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдЪ рдХрд░ рджрд┐рдЦрд╛рдпрд╛ рд╣реИред



рдФрд░, рдзреНрдпрд╛рди рджреЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдЬреАрд╡рди рдЬреАрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рд╡рд┐рд▓реЛрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдлрд┐рд░ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдиреЛрдЯ рдкрд░ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ)ред



</ рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░>



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ



рдЪрд▓рд┐рдП CodeGeneratorAbstractProcessor рдХреНрд▓рд╛рд╕ рдХреЛ рдереЛрдбрд╝рд╛ рд░реАрдореЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде NVI рдХреЗ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджреЗрдЦреЗрдВ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ:



 #include <string> #include <stdexcept> #include <iostream> class CodeGeneratorAbstractProcessor { public: std::string generateCode() { return code(); } std::string someCodeRelatedThing() { return thing(); } protected: ~CodeGeneratorAbstractProcessor() {} private: virtual std::string code() = 0; virtual std::string thing() = 0; }; class CodeGeneratorJavaProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { return std::string("Java: System.out.println(\"Hello world!\");"); } std::string thing() { return std::string("http://www.java.com/"); } }; class CodeGeneratorCppProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { return std::string("C++: std::cout << \"Hello world!\";"); } std::string thing() { return std::string("http://www.cplusplus.com/doc/tutorial/"); } }; class CodeGeneratorBadProcessor : public CodeGeneratorAbstractProcessor { public: std::string code() { throw new std::logic_error("Bad language"); return std::string(); } std::string thing() { throw new std::logic_error("Bad language"); return std::string(); } }; void i_like_to_use_generators(CodeGeneratorAbstractProcessor * cg) { std::cout << cg->generateCode() << "\tMore info: " << cg->someCodeRelatedThing() << std::endl; } int main() { CodeGeneratorJavaProcessor java; i_like_to_use_generators(&java); return 0; }
      
      





рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдЬреА рдФрд░ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдм рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рдЬреАрдЧрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдХреЛ рдЗрд╖реНрдЯрддрдо рдмрдирд╛рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:



 #include <string> #include <stdexcept> #include <iostream> class CodeGeneratorAbstractProcessor { public: std::string generateCode() { return lang() + ": " + code(); } std::string someCodeRelatedThing() { return thing(); } protected: ~CodeGeneratorAbstractProcessor() {} private: virtual std::string lang() = 0; virtual std::string code() = 0; virtual std::string thing() = 0; }; class CodeGeneratorJavaProcessor : public CodeGeneratorAbstractProcessor { public: std::string lang() { return std::string("Java"); } std::string code() { return std::string("System.out.println(\"Hello world!\");"); } std::string thing() { return std::string("http://www.java.com/"); } }; class CodeGeneratorCppProcessor : public CodeGeneratorAbstractProcessor { public: std::string lang() { return std::string("C++"); } std::string code() { return std::string("std::cout << \"Hello world!\";"); } std::string thing() { return std::string("http://www.cplusplus.com/doc/tutorial/"); } }; class CodeGeneratorBadProcessor : public CodeGeneratorAbstractProcessor { public: std::string lang() { throw new std::logic_error("Bad language"); return std::string("???"); } std::string code() { throw new std::logic_error("Bad language"); return std::string(); } std::string thing() { throw new std::logic_error("Bad language"); return std::string(); } }; void i_like_to_use_generators(CodeGeneratorAbstractProcessor * cg) { std::cout << cg->generateCode() << "\tMore info: " << cg->someCodeRelatedThing() << std::endl; } int main() { CodeGeneratorJavaProcessor java; i_like_to_use_generators(&java); return 0; }
      
      





рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдЕрдм рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд╕рдВрдЧрдд, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рддрд╛рд░реНрдХрд┐рдХ рдирд╣реАрдВред рдФрд░ рдЦреБрдж рд╡рд░реНрдЧ рдЕрдм рд╕рднреА рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрд╢рд╛рд╕рди рдФрд░ рд╕рдВрд░рдЪрдирд╛ рддрдп рдХрд░рддрд╛ рд╣реИред



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╕рднреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реБрдХрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдореИрдВ рдЕрдкрдиреА рдЯреЛрдкреА рдХреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд▓реЗ рдЬрд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рд╛ рд╣реИред рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж



рдФрд░ рддрд╕реНрд╡реАрд░ рдПрдХ рдбреЙрд▓реНрдореЗрди рджрд┐рдЦрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд▓реЗрдЦ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд╡реЗ рдереЗ рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред



All Articles