RESS - рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░



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

рдкрд░рд┐рдЪрдп


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

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

рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдЦрд░рд╛рдм рдХреНрдпреЛрдВ рд╣реИрдВ?


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

1. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП


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

2. рдУрд╡рд░-рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЦрд░рд╛рдм рд╣реИ


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

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

рдЕрдм VIPER рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЖрд░реЗрдЦ рдкрд░ рджреЗрдЦреЗрдВред

рдпреЛрдЬрдирд╛
рдЫрд╡рд┐

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

рдирдпрд╛ рддрд░реАрдХрд╛


рдЕрд░реЗ, рдореБрдЭреЗ рднреА рдПрдХ рдлреИрд╢рдиреЗрдмрд▓ рдирд╛рдо рдЪрд╛рд╣рд┐рдП ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ RESS - R рдЗрдХреНрд╡реЗрд╕реНрдЯ, рдИ рд╡реЗрдВрдЯ, S creen, S torage рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдХреНрд╖рд░ рдФрд░ рдирд╛рдо рдПрдХ рдкрдардиреАрдп рд╢рдмреНрдж рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рд╣реИрдВред рдареАрдХ рд╣реИ, рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдо рдкреИрджрд╛ рди рдХрд░реЗрдВред рдЦреИрд░, рдзреБрди рдореЗрдВ рдЖрд░рдИрдПрд╕рдЯреА рдХреЗ рд╕рд╛рдеред

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



1. рднрдВрдбрд╛рд░рдг


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

2. рд╕реНрдХреНрд░реАрди


рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдХреНрд░реАрди, рдпрд╣ рдЖрдкрдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИред рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ Apple рдХреЗ MVC рдХреА рддрд░рд╣ рдПрдХ рдирд┐рдпрдорд┐рдд ViewController рд╣реИред

3. рдирд┐рд╡реЗрджрди


рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ REST рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

4. рдШрдЯрдирд╛


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓реАрдХреГрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХреЛрдб рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЯрд╛рдЗрдкреЛрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдкреНрд░рд╛рд░реНрдердирд╛
public class Request { public interface RequestListener { default void onApiMethod1(Json answer) {} default void onApiMethod2(Json answer) {} } private static class RequestTask extends AsyncTask<Void, Void, String> { public RequestTask(String methodName) { this.methodName = methodName; } private String methodName; @Override protected String doInBackground(Void ... params) { URL url = new URL(Request.serverUrl + "/" + methodName); HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection(); // ... //      // ... return result; } @Override protected void onPostExecute(String result) { // ... //  JSON  result // ... Requestr.onHandleAnswer(methodName, json); } } private static String serverUrl = "myserver.com"; private static List<OnCompleteListener> listeners = new ArrayList<>(); private static void onHandleAnswer(String methodName, Json json) { for(RequestListener listener : listeners) { if(methodName.equals("api/method1")) listener.onApiMethod1(json); else if(methodName.equals("api/method2")) listener.onApiMethod2(json); } } private static void makeRequest(String methodName) { new RequestTask(methodName).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } public static void registerListener(RequestListener listener) { listeners.add(listener); } public static void unregisterListener(RequestListener listener) { listeners.remove(listener); } public static void apiMethod1() { makeRequest("api/method1"); } public static void onApiMethod2() { makeRequest("api/method2"); } } 


рднрдВрдбрд╛рд░рдг
 public class DataStorage { public interface DataListener { default void onData1Changed() {} default void onData2Changed() {} } private static MyObject1 myObject1 = null; private static List<MyObject2> myObjects2 = new ArrayList<>(); public static void registerListener(DataListener listener) { listeners.add(listener); } public static void unregisterListener(DataListener listener) { listeners.remove(listener); } public static User getMyObject1() { return myObject1; } public static List<MyObject2> getMyObjects2() { return myObjects2; } public static Request.RequestListener listener = new Request.RequestListener() { private T fromJson<T>(Json answer) { // ... //    JSON // ... return objectT; } @Override public void onApiMethod1(Json answer) { myObject1 = fromJson(answer); for(RequestListener listener : listeners) listener.data1Changed(); } @Override public void onApiMethod2(Json answer) { myObject2 = fromJson(myObjects2); for(RequestListener listener : listeners) listener.data2Changed(); } }; } 


рд╕реНрдХреНрд░реАрди
 public class MyActivity extends Activity implements DataStorage.DataListener { private Button button1; private Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); button1.setOnClickListener((View) -> { Request.apiMethod1(); }); button2.setOnClickListener((View) -> { Request.apiMethod2(); }); updateViews(); } @Override protected void onPause() { super.onPause(); DataStorage.unregisterListener(this); } @Override protected void onResume() { super.onResume(); DataStorage.registerListener(this); updateViews(); } private void updateViews() { updateView1(); updateView2(); } private void updateView1() { Object1 data = DataStorage.getObject1(); // ... //     // ... } private void updateView2() { List<Object2> data = DataStorage.getObjects2(); // ... //     // ... } @Override public void onData1Changed() { updateView1(); } @Override public void onData2Changed() { updateView2(); } } 


рдРрдк
 public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Request.registerListener(DataStorage.listener); } } 


рд╡рд╣реА рдХрд┐рдиреНрдирд░, рд▓реЗрдХрд┐рди рд╕рдордЭ рдХреЗ рд▓рд┐рдП RESS рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ


рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдЬрдм рдЖрдк рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдЪрд┐рдХреЛрдЯреА рд╣реЛрддреА рд╣реИ, рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдбрд╛рдЯрд╛рд╕реНрдЯреЛрд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред DataStorage рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдШрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рддрдм рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╕реНрдХреНрд░реАрди рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕реНрдХреНрд░реАрди рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЗрддреА рд╣реИ рдФрд░ UI рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИред

рд╕реНрдХреНрд░реАрди рд╕рдВрдХреЗрдд рдФрд░ рдХреНрд░рдорд╢рдГ Resume рдФрд░ onPause рдореЗрдВ рдордзреНрдпрд╕реНрдерддрд╛ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ onResume рдХреЗ рдЕрд▓рд╛рд╡рд╛ UI рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рд╕реВрдЪрдирд╛рдПрдВ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд░рд┐рдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрддреА рд╣реИрдВ, рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдЕрджреНрдпрддрд┐рдд рд░рд╣реЗрдЧреАред рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧреА, рдФрд░ рд╕рдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрдиреЗ рдкрд░, рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирддреАрдЬрддрди, рдЬрдм рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдФрд░ рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб рдПрд╕рдбреАрдХреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдкреАрдЖрдИ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред

рднрд╡рд┐рд╖реНрдп рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдФрд░ рдЙрддреНрддрд░


1. рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИ?


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

2. AsyncTask рдПрдХ рдмреБрд░рд╛ рдЖрджрдореА рд╣реИ, рдХрдо рд╕реЗ рдХрдо Retrofit рд▓реЛ!


рд╣рд╛рдБ? рдФрд░ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ? рдореЗрдореЛрд░реА рд▓реАрдХ? рдирд╣реАрдВ, рдпрд╣рд╛рдБ AsyncTask рд╕рдХреНрд░рд┐рдпрдг рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред рдЬрд╡рд╛рдм рдЦреЛ рдЧрдпрд╛ рд╣реИ? рдирд╣реАрдВ, рдЬрд╡рд╛рдм рд╣рдореЗрд╢рд╛ рд╕реНрдереИрддрд┐рдХ DataStorage рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрд╡реЗрджрди рдХреЛ рдорд╛рд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдард╣рд░рд╛рд╡ рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдирд╣реАрдВ, рд╕реВрдЪрдирд╛рдПрдВ рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрддреА рд╣реИрдВред

рдФрд░ рдпрд╣рд╛рдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЬрд░рд╛ рдпрд╣рд╛рдВ рджреЗрдЦрд┐рдПред рд▓реЗрдЦрдХ рдиреЗ RxJava, Retrofit рд▓рд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрд╕рд╛рдЦреА рдХреЛ рдХрд╛рдЯрддрд╛ рд╣реИ рдЬреЛ RESS рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИред

3. рд╕реНрдХреНрд░реАрди рдПрдХ рд╣реА ViewController рд╣реИ! рддрд░реНрдХ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЧрд┐рд░рдлреНрддрд╛рд░реА!


рдЗрд╕ рдордВрддреНрд░ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдЧрд┐рд░рд╛ рджреЗрдВред REST рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рджреГрд╢реНрдп рд╣реИред рдЖрдкрдХреЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдПрдХ рдмрдЯрди рдпрд╛ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдЖрдк рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рдХрд╣реЛ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛? 1 рдЯрди рдЖрд╕рд╛рди рдХреЗ рд╕рд╛рде 1 рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЬрд╛рдп 3 рдЯрди рдХреЛрдб рдХреЗ рд╕рд╛рде 3 рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдП рд░рдЦреЗрдВ? рд▓рдЧрднрдЧред рдФрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 5 рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИ? рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 3 x (5 + 1) = 18 рдлрд╛рдЗрд▓реЗрдВ рд╣реИред

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп рдореЗрдВ рдЕрд▓рдЧрд╛рд╡ рдмрд╕ рд╡реНрдпрд░реНрде рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдПрдорд╡реАрдкреА рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордЬреЗрджрд╛рд░ рд╣реИ: рдХреНрдпрд╛ рдЖрдк рдПрдХ рдмрдЯрди рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛, рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рджреГрд╢реНрдп-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдареАрдХ рдХрд░реЗрдВред RESS рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреВрдВрдЧрд╛ред

рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ ViewController рдмрд╣реБрдд рдмрдврд╝рддрд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП рдЖрдкрдиреЗ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВред 5 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рд╡рд╛рд▓реА рдЕрдЧрд▓реА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ REST рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ 5 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рдкрд░ 5 рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред 100 + рд╕реНрдХреНрд░реАрди рдФрд░ 10 рд▓реЛрдЧреЛрдВ рдХреА рдХрдИ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде RESS рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИрдВред рдмрд╕ рдХреБрдЫ рдЕрдиреБрд░реЛрдз рдФрд░ рд╕рдВрдЧреНрд░рд╣рдг рдХрд░реЗрдВред рдФрд░ рдмреЛрд▓реНрдб рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдореЗрдВ рдмрдбрд╝реЗ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдХреНрд░реАрди рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рдЯреБрдХрдбрд╝реЗред рдЙрд╕реА рдкреИрдорд╛рдиреЗ рдХреЗ рдПрдорд╡реАрдкреА рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╕ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛, рдЗрдВрдЯрд░рдлреЗрд╕, рд╕рдХреНрд░рд┐рдпрдг, рдЯреБрдХрдбрд╝реЗ рдФрд░ рдЕрд╕рдВрдмрджреНрдз рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдбреВрдм рдЬрд╛рдПрдЧреАред рдФрд░ VIPER рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдЖрдо рддреМрд░ рдкрд░ рдкреВрд░реА рдЯреАрдо рдХреЛ рдПрдХ рджрд┐рди рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


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

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


All Articles