рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо

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

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
template<typename T> T& single() { static T t; return t; } 


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

рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ C ++ рдореЗрдВ рдХреЛрдИ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдПрдХ рджреБрд░реНрд▓рдн рдЕрддрд┐рдерд┐ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдирд╛рддреЗ рд╣реИрдВ:
  1. рдЬрдм рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧред
  2. рдкрд╣рд▓реЗ рд╕реЗ рд╣рдЯрд╛рдИ рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧред
  3. рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдЧреИрд░-рдореБрдХреНрдд рдореЗрдореЛрд░реАред

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

рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИрдВред рд╣рдо рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ [1] рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ C ++ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рддреЗ рд╣реИрдВ:
 class OnlyOne { public: static OnlyOne* Instance() { if(theSingleInstance==0) theSingleInstance=new OnlyOne; return theSingleInstance; } private: static OnlyOne* theSingleInstance; OnlyOne(){}; }; OnlyOne* OnlyOne::theSingleInstance=0; 

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

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

рдЕрдкрдиреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ 2 рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдореЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА:
  1. рдирдпрд╛ рдкреНрд░рдпреЛрдЧ рди рдХрд░реЗрдВред
  2. рдбрд┐рд▓реАрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░реЗрдВред

рдпрд╣ рдореЗрд░реЗ рдорддрд▓рдм рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рднреА рдирдпрд╛ рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдЗрд╕реЗ рд╕реНрдкреНрд░реЗ рди рдХрд░реЗрдВред рдлрд┐рд░, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрдЪрд┐рдд рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рде, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдФрд░ рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ! рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рддреЛ рд╣рдо рдПрдХ рддрд░рд╣ рдХреЗ рдЦреЛрдЬрдХрд░реНрддрд╛ рд╣реЛрдВрдЧреЗред

рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, C ++ рдореЗрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЯреВрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХреА рдЪрддреБрд░рд╛рдИ рдпрд╣ рд╣реИ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИред рдЬрдм рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╕реНрдорд╛рд░реНрдЯ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдирдХ std :: shared_ptr рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬреЛ C ++ 0x рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдмрдврд╝рд╛рд╡рд╛ :: рд╕рд╛рдЭрд╛_рдкреНрдЯреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред

рд╣рдо рдЕрдкрдиреЗ рд╡рд░реНрдЧ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реНрддрд╡реНрдп рд╕реМрдВрдкрддреЗ рд╣реИрдВ:
  1. рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВред
  2. рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдирдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рд╕рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:
 template<typename T> struct An { template<typename U> friend struct An; An() {} template<typename U> An(const An<U>& a) : data(a.data) {} template<typename U> An(An<U>&& a) : data(std::move(a.data)) {} T* operator->() { return get0(); } const T* operator->() const { return get0(); } bool isEmpty() const { return !data; } void clear() { data.reset(); } void init() { if (!data) reinit(); } void reinit() { anFill(*this); } T& create() { return create<T>(); } template<typename U> U& create() { U* u = new U; data.reset(u); return *u; } template<typename U> void produce(U&& u) { anProduce(*this, u); } template<typename U> void copy(const An<U>& a) { data.reset(new U(*a.data)); } private: T* get0() const { const_cast<An*>(this)->init(); return data.get(); } std::shared_ptr<T> data; }; 


рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
  1. рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП C ++ 0x рдорд╛рдирдХ рд╕реЗ рдЪрд╛рд▓ рд╢рдмреНрджрд╛рд░реНрде [6] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  2. рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рд╕ рдЯреА рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рдЙрдкрдЬ рд╡рд┐рдзрд┐ рд╕реНрд╡реАрдХреГрдд рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд┐рдзрд┐ рдХрдХреНрд╖рд╛ рдХреА рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдирдХрд▓ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:
 template<typename T> struct AnAutoCreate : An<T> { AnAutoCreate() { create(); } }; template<typename T> T& single() { static T t; return t; } template<typename T> An<T> anSingle() { return single<AnAutoCreate<T>>(); } 


рд╣реЗрд▓реНрдкрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдЗрд╕ рддрд░рд╣ рд╣реЛрдВрдЧреЗ:
 #define PROTO_IFACE(D_iface, D_an) \ template<> void anFill<D_iface>(An<D_iface>& D_an) #define DECLARE_IMPL(D_iface) \ PROTO_IFACE(D_iface, a); #define BIND_TO_IMPL(D_iface, D_impl) \ PROTO_IFACE(D_iface, a) { a.create<D_impl>(); } #define BIND_TO_SELF(D_impl) \ BIND_TO_IMPL(D_impl, D_impl) #define BIND_TO_IMPL_SINGLE(D_iface, D_impl) \ PROTO_IFACE(D_iface, a) { a = anSingle<D_impl>(); } #define BIND_TO_SELF_SINGLE(D_impl) \ BIND_TO_IMPL_SINGLE(D_impl, D_impl) #define BIND_TO_IFACE(D_iface, D_ifaceFrom) \ PROTO_IFACE(D_iface, a) { anFill<D_ifaceFrom>(a); } #define BIND_TO_PROTOTYPE(D_iface, D_prototype) \ PROTO_IFACE(D_iface, a) { a.copy(anSingle<D_prototype>()); } 


BIND_TO_IMPL_SINGLE рдореИрдХреНрд░реЛ рдореЗрдВ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рд╣реИрдВ, рдЬреЛ рдЕрдм рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп aSingle рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, An рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рднрд░реЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рдореИрдХреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЕрдм, рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 // header file struct X { X() { x = 1; } int x; }; //    DECLARE_IMPL(X) // cpp file struct Y : X { Y() { x = 2; } int y; }; //   X   Y   BIND_TO_IMPL_SINGLE(X, Y) 


рдЕрдм рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 An<X> x; std::cout << x->x << std::endl; 


рд╕реНрдХреНрд░реАрди рдкрд░ рд╡рд╣ рдирдВрдмрд░ 2 рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕ рд╡рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЬреАрд╡рди рд╕рдордп рдирд┐рдпрдВрддреНрд░рдг


рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╕рд┐рдВрдЧрд▓рдиреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:
 struct A { A() { std::cout << "A" << std::endl; a = 1; } ~A() { std::cout << "~A" << std::endl; a = -1; } int a; }; struct B { B() { std::cout << "B" << std::endl; } ~B() { std::cout << "~B" << std::endl; out(); } void out() { std::cout << single<A>().a << std::endl; } }; 


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреЙрд▓ рдХреЛ рдЖрдЙрдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 single<B>().out(); //    B A 1 ~A ~B -1 

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

рдЖрдЗрдП рдЕрдм рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рдеред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 struct A { A() { std::cout << "A" << std::endl; a = 1; } ~A() { std::cout << "~A" << std::endl; a = -1; } int a; }; //   A      BIND_TO_SELF_SINGLE(A) struct B { An<A> a; B() { std::cout << "B" << std::endl; } ~B() { std::cout << "~B" << std::endl; out(); } void out() { std::cout << a->a << std::endl; } }; //   B      BIND_TO_SELF_SINGLE(B) //  An<B> b; b->out(); 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдпрд╣ рдХреЛрдб рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:
  1. рдСрдмреНрдЬреЗрдХреНрдЯ A рдФрд░ B рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  2. рдХрдХреНрд╖рд╛ рдмреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдЧ рдП рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рджрд╕реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛ рдП рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЕрдзрд┐рдХ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдм рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
 B A 1 ~B 1 ~A 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдП рдХреЗ рдЬреАрд╡рди рдХреЛ рдмрдврд╝рд╛рдпрд╛ рд╣реИ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред -1 рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рджреМрд░рд╛рди рдореМрдЬреВрдж рдереАред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


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

рдкреБрдирд╢реНрдЪ


рдХрдИ рд▓реЛрдЧ рдкреВрдЫрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ? рдЖрдк рд╕рд┐рд░реНрдл рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ? рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд▓реЗрдЦ [0] рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде, рдХреЛрдИ рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ рдФрд░ рдХрдИ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдФрд░ рд▓реЗрдЦ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЬреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╕рдм рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЙрд▓рдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд [4] рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ ( рдУрдб рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рднреА рджреЗрдЦреЗрдВ [5] )ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рджреЗрдЦрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдирд╛рд░рд╛рдЬ рдерд╛ рдХрд┐ рдпрд╣ C ++ рдореЗрдВ рдЦрд░рд╛рдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдРрд╕реА рд░реВрдкрд░реЗрдЦрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рд╣рд▓реНрдХреЗ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪрд╛рд╣реВрдВрдЧрд╛)ред рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯрд╛ рдХрджрдо рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рд╛рднрдХрд╛рд░реА рд╣реИред

рдореИрдВ рдХреБрдЫ рдФрд░ рдмрд╛рддреЛрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдпреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ):
  1. рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдПрдлрд╝рд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рдкрд╣рд▓рд╛ рд▓реЗрдЦ [0] рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
  3. рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрд▓рдЧрд╛рд╡ рд╣реИ: рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзред рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
  4. рд╕рд┐рдВрдЧрд▓рдЯрди рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг, рд╡рд░реНрдЧ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред


рдЕрджреНрдпрддрди


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓рдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд, рдбреАрдЖрдИрдкреА рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЙрд▓рдЯрд╛, рдЖрдИрдУрд╕реА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА:
 struct IDatabase { virtual ~IDatabase() {} virtual void beginTransaction() = 0; virtual void commit() = 0; ... }; 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рд┐рдд рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
 struct UserManager { An<IDatabase> aDatabase; User getUser(int userId) { aDatabase->beginTransaction(); ... } }; 

рдпрд╣рд╛рдБ рд╣рдо aDatabase рд╕рджрд╕реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрдЧрд╛, рдЙрд╕реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреМрди рдФрд░ рдХрдм рднрд░реЗрдЧрд╛ / рднрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди UserManager рд╡рд░реНрдЧ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдХрд╣рддрд╛ рд╣реИ: "рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗ рджреЛ, рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХрд╛ рд╣рд░ рдХрд╛рдо рдХрд░реВрдБрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реВрдБрдЧрд╛ред"

рдЕрдм рд╣рдо рдЯреНрд░рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ: рдареАрдХ рд╣реИ, рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рднрд░рдг рдореЗрдВ рд╣рд░ рдмрд╛рд░ рднрд╛рдк рд╕реНрдирд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рд╕реНрд╡рдпрдВ рднрд░реЗрдВ :
 struct MyDatabase : IDatabase { virtual void beginTransaction(); ... }; BIND_TO_IMPL_SINGLE(IDatabase, MyDatabase) 

рдпрд╛рдиреА рд╣рдо MyDatabase рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ BIND_TO_IMPL_SINGLE рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рдирд┐рдореНрди рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ MyDatabase рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:
 UserManager manager; User user = manager.getUser(userId); 

рд╕рдордп рдХреЗ рд╕рд╛рде, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдХрд╣рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рд╕рдВрдЧрдарди рдХреЗ рд▓рд┐рдП:
 struct AnotherDatabase : IDatabase { ... }; 

рдмреЗрд╢рдХ, рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рдеред рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ:
 UserManager manager; manager.aDatabase = anSingle<AnotherDatabase>(); User user = manager.getUser(userId); 

рдФрд░ рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рджреВ рд╕реЗ, рдЕрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреВрд╕рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ! рдпрд╣ рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреНрд░реВрдб рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ IDATabase рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрдЬрд╛рдп рдПрдХ UserManager рдХреЗ рд╕рд╛рде рднрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм UserManager рд╕реНрд╡рдпрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рд╣рд┐рддреНрдп


рд╕рд┐рдВрдЧреНрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
[рез] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рд╕рд┐рдВрдЧрд▓рдЯрди
[реи] рдЗрдирд╕рд╛рдЗрдб C ++: рд╕рд┐рдВрдЧрд▓рдЯрди
[рей] рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдкреИрдЯрд░реНрди: рд╕рд┐рдВрдЧрд▓рдЯрди
[рек] рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрд▓рдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд
[рел] OOD рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд
[рем] рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛: рд╕рдВрджрд░реНрдн рдФрд░ рдЧрддрд┐ рд╢рдмреНрджрд╛рд░реНрде

Source: https://habr.com/ru/post/In118368/


All Articles