рд╣рдо рдХреЛрдб рдЕрдкрдШрдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдбрд╛рд▓реЗрдВрдЧреЗ: рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

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


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


рд╡рд┐рдЪрд╛рд░


рд╡рд┐рдЪрд╛рд░ рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдердиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:


  • рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ;
  • рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╛ рддреЛ рдПрдХ рд╕рдлрд▓ рдпрд╛ рдЕрд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред

рдЫрджреНрдо-рдХреВрдЯ рд╕реНрддрд░ рдкрд░, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


do-something-elementary(context) -> [:ok updated_context] | [:error reason]


рдЬрд╣рд╛рдВ:


  • do-something-elementary - рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо;
  • context - рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИ;
  • updated_context - рдЕрджреНрдпрддрди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ;
  • reason - рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛, рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг, рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рдеред

рд╡рд╣ рдкреВрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдФрд░ рдлрд┐рд░ - рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдорд╛рдорд▓рд╛ред 100,500 рдорд┐рд▓рд┐рдпрди рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рдеред


рдЙрджрд╛рд╣рд░рдг: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд░реАрджрд╛рд░реА рдХрд░ рд░рд╣рд╛ рд╣реИ


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


buy-lot(user_id, lot_id) -> [:ok updated_user] | [:error reason]


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


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


until-first-error рдлрд╝рдВрдХреНрд╢рди


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


until-first-error(fs, init_context) -> [:ok updated_context] | [:error reason]


рдЬрд╣рд╛рдВ:


  • fs рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ (рдкреНрд░рд╛рдердорд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ);
  • init_context рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрджрд░реНрдн рд╣реИред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдБ GitHub рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


with-result-or-error


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


with-result-or-error(f, key, context) -> [:ok updated_context] | [:error reason]


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдХреЛрдб рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реА "рд╕реБрдВрджрд░рддрд╛" ...


рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЦрд░реАрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ


 1. (defn buy-lot [user_id lot_id] 2. (let [with-lot-fn (partial 3. util/with-result-or-error 4. #(lot-db/find-by-id lot_id) 5. :lot) 6. 7. buy-lot-fn (fn [{:keys [lot] :as ctx}] 8. (util/with-result-or-error 9. #(user-db/update-by-id! 10. user_id 11. (fn [user] 12. (let [wallet_v (get-in user [:wallet :value]) 13. price_v (get-in lot [:price :value])] 14. (if (>= wallet_v price_v) 15. (let [updated_user (-> user 16. (update-in [:wallet :value] 17. - 18. price_v) 19. (update-in [:lots] 20. conj 21. {:lot_id lot_id 22. :price price_v}))] 23. [:ok updated_user]) 24. [:error {:type :invalid_wallet_value 25. :details {:code :not_enough 26. :provided wallet_v 27. :required price_v}}])))) 28. :user 29. ctx)) 30. 31. fs [with-lot-fn 32. buy-lot-fn]] 33. 34. (match (util/until-first-error fs {}) 35. 36. [:ok {:user updated_user}] 37. [:ok updated_user] 38. 39. [:error reason] 40. [:error reason]))) 

рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:


  • рдкреАред 34: match clojure.core.match рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдорд┐рд▓рд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ;
  • рдкреАред 34-40: рд╣рдо рдкреНрд░рд╛рдердорд┐рдХ рдХрджрдореЛрдВ until-first-error рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рд╣реБрдЖ рдЖрд╡реЗрджрди рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрджрд░реНрдн рд╕реЗ рд╣рдореЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдП рдЙрд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ;
  • рдкреАред 2-5: рд╣рдо рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬрд┐рд╕ рдкрд░ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рдЬреЛ рдмрд╕ рдХреБрдВрдЬреА рдкрд░ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ :lot рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП :lot ;
  • рдкреАред 7-29: рдпрд╣рд╛рдВ рд╣рдо рдкрд░рд┐рдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди with-result-or-error рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдкреИрд╕рд╛ рд╣реИ рдФрд░, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рддреЛ рд╣рдо рдЦрд░реАрджрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╣реИ (рдФрд░ рдЬреЛ рдХрд╣реАрдВ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдПрдХ-рдкрд┐рд░реЛрдпрд╛ рдЖрд╡реЗрджрди рджреЗрдЦрд╛?) рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:


  • lot-db/find-by-id(id) - рдмрд╣реБрдд рдХреБрдЫ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, id рджреНрд╡рд╛рд░рд╛;
  • user-db/update-by-id!(user_id, update-user-fn) - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ user_id (рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ) рдореЗрдВ update-user-fn user_id update-user-fn рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? ...


рдХреНрд▓реЛрдЬрд░ REPL рд╕реЗ рдЗрд╕ рдирдореВрдирд╛ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рд╕реЗ рдХрдВрд╕реЛрд▓ рд╕реЗ REPL рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


 lein repl 

рд╡рд┐рддреНрдд рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рд╣реИрдВ:


 context-aware-app.core=> (context-aware-app.user.db/enumerate) [:ok ({:id "1", :name "Vasya", :wallet {:value 100}, :lots []} {:id "2", :name "Petya", :wallet {:value 100}, :lots []})] 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ (рдорд╛рд▓) рд╣реИрдВ:


 context-aware-app.core=> (context-aware-app.lot.db/enumerate) [:ok ({:id "1", :name "Apple", :price {:value 10}} {:id "2", :name "Banana", :price {:value 20}} {:id "3", :name "Nuts", :price {:value 80}})] 

рд╡рд╛рд╕рд╛ рдПрдХ рд╕реЗрдм рдЦрд░реАрджрддрд╛ рд╣реИ:


 context-aware-app.core=>(context-aware-app.processing/buy-lot "1" "1") [:ok {:id "1", :name "Vasya", :wallet {:value 90}, :lots [{:lot_id "1", :price 10}]}] 

рдФрд░ рдХреЗрд▓рд╛:


 context-aware-app.core=> (context-aware-app.processing/buy-lot "1" "2") [:ok {:id "1", :name "Vasya", :wallet {:value 70}, :lots [{:lot_id "1", :price 10} {:lot_id "2", :price 20}]}] 

рдФрд░ "рдирдЯ":


 context-aware-app.core=> (context-aware-app.processing/buy-lot "1" "3") [:error {:type :invalid_wallet_value, :details {:code :not_enough, :provided 70, :required 80}}] 

рдирдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдзрди рдирд╣реАрдВ рдерд╛ред


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


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


  • рдХреЛрдб рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдкрд░ рд╕рдордп рдХреА рдмрдЪрдд;
  • рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рдкрд░реАрдХреНрд╖рдг
  • рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ (рдХреЙрдкреА-рдкреЗрд╕реНрдЯ + рдбреЙрдкрд┐рд▓рд┐рд╡рдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ);
  • рдХреЛрдб рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдгред

рдпрд╛рдиреА рд╡рд╣ рд╕рдм рдЬрд┐рд╕рд╕реЗ рд╣рдо рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред


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


All Articles