рдкреЗрд╢ рд╣реИ рдЧреНрд░реАрди-рдлреЙрд░реЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ

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

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



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЧреНрд░реАрди-рдлреЙрд░реЗрд╕реНрдЯ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛


рдмрд╣реБрдд рдмрд╛рд░, рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реНрдпрд╡рд╕рд╛рдп рдкрд░рдд рдФрд░ рдбреЗрдЯрд╛ рд╕реНрддрд░ рдореЗрдВ рд╕реЗрд╡рд╛ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред
рдРрд╕реА рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
public interface UserService { User createUser(Object someData); void activateUser(long id); User updateUser(User updatedUser); void blockUser(long id); void unblockUser(long id); } 


рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдврд╝рддрд╛ рд╣реИ, рд╕рдорд╛рди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХрд╛ рдереЛрдХ рдмрдврд╝рддрд╛ рд╣реИ:
 public class UserServiceImpl implements UserService { //  1-   public User createUser(Object someData) { //  10-15  } // 16-   public void activateUser(long id) { //  10-15  } // .. //  1000-   public void unblockUser(long id) { //  10-15  } } 


рдирддреАрдЬрддрди, рдХрдХреНрд╖рд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдФрд░ рдХреЛрдб рдХреА 1000 рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдвреВрдВрдврдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрдард┐рди рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдорд╛рдзрд╛рди



рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдПрдХ рдмрдбрд╝реА рд╕реЗрд╡рд╛ рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реИ:
 public interface UserBasicService { User createUser(Object someData); void activateUser(long id); User updateUser(User updatedUser); } public interface UserModerationService { void blockUser(long id); void unblockUser(long id); } 


рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рджрдЧреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

рд╡рд░реНрджреА рдЬреБрджрд╛рдИ рдХреА рдХрдард┐рдирд╛рдИ : рд╕реЗрд╡рд╛ рдХреЛ рд╕рдорд╛рди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдПрдХ рдирдИ рд╕реЗрд╡рд╛ рдореЗрдВ 3 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢реЗрд╖ рд╣реИрдВ, 10 рдЕрдиреНрдп рдореЗрдВред

рдкреГрдердХреНрдХрд░рдг рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ : рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкрджреНрдзрддрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕рд╣рд╛рдпрдХ рд╕реЗрд╡рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рддрд░реАрдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рд╕рдордЭрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдиреНрдореВрд▓рди, рд▓реЗрдХрд┐рди рдХрд╛рд░рдг рдирд╣реАрдВ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирдИ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде, рд╡реЗ рднрд╛рд░реА-рд░реЗрдЦрд╛ рдХреЗ 1000-рд▓рд╛рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдмреЛрдЭрд┐рд▓ рд╕реЗрд╡рд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдзрд╛рди


рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЗ рдХрдИ рд╕рдорд╛рдиреЛрдВ рдореЗрдВ рд╕рд░рд▓ рд╡рд┐рднрд╛рдЬрди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЦреБрдж рд╕реЗ рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рдорд╛рдгреБ рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдЦрд┐рд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕рдХреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рд╕реЗ, рд╣рдореЗрдВ рдКрдкрд░ рдХреА рдХрдорд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗрдЧрд╛:

рдЕрд╕рдорд╛рди рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЕрд▓рдЧрд╛рд╡ рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ : рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рд╣рд░рд┐рдд-рд╡рди рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



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


рдЗрд╕ рд╕рд░реНрдХрд┐рдЯ рдХреЗ рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  1. рдХрд╛рд░реНрдп


    рдПрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдПрдХ рдкрд░рдорд╛рдгреБ "рд╡рд┐рдзрд┐" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ "рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"ред рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ:
     // Action     - String   - Integer public class SomeAction extends Action<String, Integer>{ public SomeAction(String input) { super(input); } } 

  2. рд╣реИрдВрдбрд▓рд░


    рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рдореЗрдВ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ:
     @Mapping(SomeAction.class) public class SomeHandler extends Handler<SomeAction>{ @Inject SomeService service; public void invoke(SomeAction action) throws Exception { String input = action.getInput(); Integer result = service.doSomeWork(input); action.setOutput(result); } } 


  3. рдврд╛рдВрдЪрд╛


    рдЗрдВрдЬрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╢рди рдФрд░ рд╣реИрдВрдбрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
     //  Engine Engine engine = new Engine(); //  engine.putHandler(SomeHandler.class); //  Integer result = engine.invoke(new SomeAction("some data")); 



рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо ActionService рд╕реЗрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ UserService рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВрдЧреЗ:
 import com.gf.service.ActionService; public interface UserService extends ActionService { //    -    ActionService } 


рдЖрдЧреЗ, рд╣рдо рдХрдИ рдПрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ:
 import com.gf.Action; public class CreateUser extends Action<Object, User> { public CreateUser(Object someData){ this(someData); } } public class ActivateUser extends Action<Long, Void> { public ActivateUser(Long id){ this(id); } } /*  .  : UpdateUser.java BlockUser.java UnblockUser.java ... */ 


рдпрд╣ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 @Mapping(CreateUser.class) public class CreateUserHandler extends Handler<CreateUser>{ public void invoke(CreateUser action) throws Exception { Object input = action.getInput(); User user = ... action.setOutput(user); } } 


UserServiceImpl рдХреЗ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 import com.gf.Action; import com.gf.core.Engine; public class UserServiceImpl implements UserService { Engine engine; public UserServiceImpl(){ engine = new Engine(); // Handler     engine.scanAndPut("some.package"); } public <I, O> O invoke(Action<I, O> action) { return engine.invoke(action); } public <I, O> O invokeUnwrap(Action<I, O> action) throws Exception { return engine.invokeUnwrap(action); } } 


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

рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рд╕рдВрджрд░реНрдн


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

рдЕрдкрдиреЗ рдХрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ, рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ!

рд╕рдВрджрд░реНрдн:
рд╣рд░рд┐рдд-рд╡рди рдХреА рд░реВрдкрд░реЗрдЦрд╛
рдкреНрд░рд▓реЗрдЦрди

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


All Articles