рд╕реАрд▓рдмрдВрдж рдХрдХреНрд╖рд╛рдПрдВред рд╢рдмреНрджрд╛рд░реНрде рдмрдирд╛рдо рдкреНрд░рджрд░реНрд╢рди

рд╢рд╛рдпрдж рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реАрд▓ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: тАЬрдареАрдХ рд╣реИред рд╢рд╛рдпрдж рдХрд┐рд╕реА рджрд┐рди рдпрд╣ рдХрд╛рдо рдЖрдПрдЧрд╛ред тАЭ рдмрд╛рдж рдореЗрдВ, рдЬрдм рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рдРрд╕реЗ рдХрд╛рд░реНрдп рдорд┐рд▓реЗ, рдЬрд╣рд╛рдБ рдореИрдВ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: тАЬрдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред тАЭ рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдкреНрд░рднрд╛рд╡реА рдЬрд╛рд╡рд╛ (рдЬреЛрд╢реБрдЖ рдмрд▓реЛрдЪ, 3) рдкреБрд╕реНрддрдХ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рд╣рд╛рдВ, рдЬрд╛рд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреБрд╕реНрддрдХ рдореЗрдВ)ред

рдЖрдЗрдП рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред


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

class State( val type: Type, val data: String?, val error: Throwable? ) { enum class Type { LOADING, ERROR, EMPTY, DATA } } 

рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)
"рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ" рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдзреНрдпрд╛рдп 23 рд╕реЗ рдЯрд┐рдкреНрдкрдгреАред рдореИрдВ рдЙрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред

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


рдирдпрд╛ рд░рд╛рдЬреНрдп рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 fun handleState(state: State) { when(state.type) { State.Type.LOADING -> onLoading() State.Type.ERROR -> state.error?.run(::onError) ?: throw AssertionError("Unexpected error state: $state") State.Type.EMPTY -> onEmpty() State.Type.DATA -> state.data?.run(::onData) ?: throw AssertionError("Unexpected data state: $state") } } fun onLoading() {} fun onError(error: Throwable) {} fun onEmpty() {} fun onData(data: String) {} 

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

рдореБрд╣рд░рдмрдВрдж рд╡рд░реНрдЧ


рдЫрд╡рд┐

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

 sealed class State //    stateless  -     singleton object Loading : State() data class Error(val error: Throwable) : State() //  ,     ,  stateless  -  singleton object Empty : State() data class Data(val data: String) : State() 

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

 fun handleState(state: State) { when(state) { Loading -> onLoading() is Error -> onError(state.error) Empty -> onEmpty() is Data -> onData(state.data) } } 

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

рдХреНрдпрд╛ рдпрд╣ рд╕рдм рдореБрдлреНрдд рд╣реИ?


рд╕реНрдкреЙрдЗрд▓рд░
рдирд╣реАрдВ, рдореБрдлреНрдд рдореЗрдВ рдирд╣реАрдВред

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

 public static final void handleState(@NotNull State state) { Intrinsics.checkParameterIsNotNull(state, "state"); if (Intrinsics.areEqual(state, Loading.INSTANCE)) { onLoading(); } else if (state instanceof Error) { onError(((Error)state).getError()); } else if (Intrinsics.areEqual(state, Empty.INSTANCE)) { onEmpty(); } else if (state instanceof Data) { onData(((Data)state).getData()); } } 

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

"рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреА рдЧрддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд╛рдкрдирд╛" рд▓реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЪрд╛рд░ рд░рд╛рдЬреНрдпреЛрдВ (LOADING, ERROR, EMPTY, DATA) рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдереА, рдпрд╣рд╛рдБ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:

 Benchmark Mode Cnt Score Error Units CompareSealedVsTagged.sealed thrpt 500 940739,966 ┬▒ 5350,341 ops/s CompareSealedVsTagged.tagged thrpt 500 1281274,381 ┬▒ 10675,956 ops/s 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрд╣рд░рдмрдВрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди the25% рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдзрд╛рд░рдгрд╛ рдереА рдХрд┐ рдЕрдВрддрд░рд╛рд▓ 10-15% рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред

рдпрджрд┐ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЪреМрдерд╛рдИ рдЕрдВрддрд░рд╛рд▓ рд╣реИ, рддреЛ рдмрдврд╝рддреЗ рдкреНрд░рдХрд╛рд░ (рдЗрдВрд╕реНрдЯрд╛рдлреЙрд░реЗрд╕реНрдЯ рдЪреЗрдХ рдХреА рд╕рдВрдЦреНрдпрд╛) рдХреЗ рд╕рд╛рде, рдЕрдВрддрд░рд╛рд▓ рдХреЗрд╡рд▓ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдХрд░ 16 (рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ):

 Benchmark Mode Cnt Score Error Units CompareSealedVsTagged.sealed thrpt 500 149493,062 ┬▒ 622,313 ops/s CompareSealedVsTagged.tagged thrpt 500 235024,737 ┬▒ 3372,754 ops/s 

рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдХрдореА рдХреЗ рд╕рд╛рде, рд╕реАрд▓ рдХреА рдЧрдИ рдмрд┐рдХреНрд░реА рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдмрдврд╝рдХрд░ --35% рд╣реЛ рдЧрдпрд╛ - рдПрдХ рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖред

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


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЕрдореЗрд░рд┐рдХрд╛ рдХреА рдЦреЛрдЬ рдирд╣реАрдВ рдХреА, рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдореБрд╣рд░рдмрдВрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдВрдХ рддреБрд▓рдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред


рдлрд┐рд░ рднреА, рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

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

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


All Articles