рдЬрд╛рджреВ рдФрд░ рд░рдХреНрдд рдХреЗ рд╕рд╛рде рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди

MVC рдкреГрдердХреНрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ


рд╣рд░ рджрд┐рди, iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реЛрддреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ MVC рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

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

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

[[RequestManager sharedInstance] loadResourcesAtPath:@"http://example.com/resources" withDelegate:self]; //  [[DatabaseManager sharedManager] saveResource:resource]; 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:


рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 @interface ViewController : UIViewController @property (nonatomic, strong) RequestManager *requestManager; @end 

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди рд╣реИрдВ - рдЕрдм рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ "рднрд░рдирд╛" рд╣реИред
рдмреНрд▓рдб рдореИрдЬрд┐рдХ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред


рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


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

DI рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ requestManager рд░реВрдк рдореЗрдВ requestManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕реЗ рдирдХрд▓реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рди рддреЛ RequestManager рдФрд░ рди рд╣реА ViewController RequestManager рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдбреАрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЧреАрдердм рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкрд░ рдХрдИ DI рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:



рдмреНрд▓рдб рдореИрдЬрд┐рдХ


рдЖрдЗрдП рдЕрдЧрд▓реЗ рдврд╛рдВрдЪреЗ рдХреЛ рджреЗрдЦреЗрдВ (рдЕрдиреНрдп рджреЛрд╖реЛрдВ рдХреЗ рд╕рд╛рде) - рд░рдХреНрдд рдЬрд╛рджреВ (BloodMagic, BM)

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

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

 @interface ViewController : UIViewController @property (nonatomic, strong) ProgressViewService *progressViewService; @property (nonatomic, strong) ResourceLoader *resourceLoader; @end @implementation ViewController - (void)loadResources { [self.progressViewService showProgressInView:self.view]; self.resourceLoader.delegate = self; [self.resourceLoader loadResources]; } - (ProgressViewService *)progressViewService { if (_progressViewService == nil) { _progressViewService = [ProgressViewService new]; } return _progressViewService; } - (ResourceLoader *)resourceLoader { if (_resourceLoader == nil) { _resourceLoader = [ResourceLoader new]; } return _resourceLoader; } @end 

рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 @interface ViewController : UIViewController <BMLazy> @property (nonatomic, strong, bm_lazy) ProgressViewService *progressViewService; @property (nonatomic, strong, bm_lazy) ResourceLoader *resourceLoader; @end @implementation ViewController @dynamic progressViewService; @dynamic resourceLoader; - (void)loadResources { [self.progressViewService showProgressInView:self.view]; self.resourceLoader.delegate = self; [self.resourceLoader loadResources]; } @end 

рдФрд░ рд╡рд╣ рд╕рдм рд╣реИред рджреЛрдиреЛрдВ @dynamic рдЧреБрдгреЛрдВ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ self.progressViewService рдФрд░ self.resourceLoader ред рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде ViewController рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд░рдХреНрдд рдЬрд╛рджреВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


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

рдПрдХ рдХрд╕реНрдЯрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдирд╛ рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╣реИ:

 BMInitializer *initializer = [BMInitializer lazyInitializer]; initializer.propertyClass = [ProgressViewService class]; initializer.initializer = ^id (id sender){ return [[ProgressViewService alloc] initWithViewController:sender]; }; [initializer registerInitializer]; 

propertyClass - рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рд╣реИред
initializer - рд╡рд╣ рдмреНрд▓реЙрдХ рдЬрд┐рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ nil рдмреНрд▓реЙрдХ рдпрд╛ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ +new рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
sender рдХрдВрдЯреЗрдирд░ рд╢реНрд░реЗрдгреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

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

 BMInitializer *usersLoaderInitializer = [BMInitializer lazyInitializer]; usersLoaderInitializer.propertyClass = [ResourceLoader class]; usersLoaderInitializer.containerClass = [UsersViewController class]; usersLoaderInitializer.initializer = ^id (id sender){ return [ResourceLoader usersLoader]; }; [usersLoaderInitializer registerInitializer]; BMInitializer *projectsLoaderInitializer = [BMInitializer lazyInitializer]; projectsLoaderInitializer.propertyClass = [ResourceLoader class]; projectsLoaderInitializer.containerClass = [ProjectsViewController class]; projectsLoaderInitializer.initializer = ^id (id sender){ return [ResourceLoader projectsLoader]; }; [projectsLoaderInitializer registerInitializer]; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, UsersViewController рдФрд░ ProjectsViewController рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, NSObject рд╡рд░реНрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рд┐рднрд┐рдиреНрди shared* рддрд░реАрдХреЛрдВ рдФрд░ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣рд╛рд░реНрдбрдХреЛрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреА:

 BMInitializer *initializer = [BMInitializer lazyInitializer]; initializer.propertyClass = [RequestManager class]; initializer.initializer = ^id (id sender){ static id singleInstance = nil; static dispatch_once_t once; dispatch_once(&once, ^{ singleInstance = [RequestManager new]; }); return singleInstance; }; [initializer registerInitializer]; 

рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рд╕рдВрдЧрдарди рдФрд░ рднрдВрдбрд╛рд░рдг


рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдИ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдЬрдЧрд╣ / рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 // LoaderInitializer.m #import <BloodMagic/Lazy.h> #import "ResourceLoader.h" #import "UsersViewController.h" #import "ProjectsViewController.h" lazy_initializer ResourseLoaderInitializers() { BMInitializer *usersLoaderInitializer = [BMInitializer lazyInitializer]; usersLoaderInitializer.propertyClass = [ResourceLoader class]; usersLoaderInitializer.containerClass = [UsersViewController class]; usersLoaderInitializer.initializer = ^id (id sender){ return [ResourceLoader usersLoader]; }; [usersLoaderInitializer registerInitializer]; BMInitializer *projectsLoaderInitializer = [BMInitializer lazyInitializer]; projectsLoaderInitializer.propertyClass = [ResourceLoader class]; projectsLoaderInitializer.containerClass = [ProjectsViewController class]; projectsLoaderInitializer.initializer = ^id (id sender){ return [ResourceLoader projectsLoader]; }; [projectsLoaderInitializer registerInitializer]; } 

lazy_initializer рдХреЛ __attribute__((constructor)) static void рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред constructor рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ main рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИ: рдЬреАрд╕реАрд╕реАред рдлрд╝рдВрдХреНрд╢рди рдЧреБрдг )ред

рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдПрдВ


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


All Articles