рд╣рдо рдПрдХ рджреБрд░реНрдЧрдо рдореЙрдбрд▓ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдУрд╣ рджреБрдЦрдж

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


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдВрд╕ рдЬрд╛рд╡рд╛ рдХреНрдпрд╛ рд╣реИ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЬрд╛рд╡рд╛рдмреАрди рд╕реЗ рдПрдХ рдореЙрдбрд▓ рд╣реИ, рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╕реНрддреА рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ / рдпрд╛ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдЬреЛ рдПрдХ рд╕рд╛рде рд▓рд╛рддрд╛ рд╣реИ рд╡рд╣ рдкреИрдХреЗрдЬ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдХ рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рд╡рд░реНрдЧ рд╣реИрдВ - рдореЙрдбрд▓ред рдХреНрд▓реЙрдХ рдФрд░ рдореЙрдбрд▓ред рд░реИрдбрд┐рдпреЛ, рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рд╣реИрдВ - рдереЛрдВрдЧреНрд╕ рдФрд░ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдВрдд рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ рд╣реЛрдЧрд╛:
import model.Radio import service.Service Radio radio = new Radio() radio.frequency = 91.2 radio.volume = 20 def json = radio.toJson() assert json == '{"frequency":91.2,"volume":20}' Radio radioClone = Radio.parseJson(json) assert radioClone == radio try { new Service().toJson() assert false } catch (MissingMethodException e){} 


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рди рддреЛ toJson () рдкрджреНрдзрддрд┐ рдФрд░ рди рд╣реА parseJson () рд╡рд┐рдзрд┐ рд░реЗрдбрд┐рдпреЛ рд╡рд░реНрдЧ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг "groovy.lang.MissingMethodException: рдХреНрд░реИрд╢ рдХрд╛ рдХреЛрдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИ: model.Rioio.toJson () рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реИ () рдореВрд▓реНрдп: [] "ред
рдЕрдВрдд рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪреЗрдВ - рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ, рдЬреЛ рдореЙрдбрд▓ рдкреИрдХреЗрдЬ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рд╢рд░реНрдорд┐рдВрджрдЧреА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк toJson рдФрд░ parseJson рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ?


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо рдХрд▓ рд╕реЗ) рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рдФрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкреИрдХреЗрдЬ рдореЙрдбрд▓ рд╕реЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдореЗрдВ toJson () рдФрд░ parseJson () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдХреИрд╕реЗ? рдЬрд╛рд╡рд╛ рдореЗрдВ, рдпрд╣ рд╕рдм рдЦрд░рд╛рдм рд╣реИ - рдЖрдк рдкреИрдХреЗрдЬ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЦреИрд░, рдпрд╣ рд╣реИ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ, рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдЬрд╛рд░ рд╕реЗ, рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рд╢реАрдЯред рдпрд╣ рд╣рдорд╛рд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЧреНрд░реВрд╡реА рд╣реИрдВред
рдЧреНрд░реВрд╡реА рдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд┐рдВрдЧ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рдЬрдм рд╕реЗ рд╣рдо рдЕрднреА рднреА рдЙрдирдХреЗ рд╕рд╛рде рд╢рдорд╛рдВ рдЦреЗрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЦреБрдж рдХреЛ рдЬрд╛рдЧреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
Groovy.lang.MetaClassRegistry рдХреНрд▓рд╛рд╕ рдореЗрдВ, рд╣рдо рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдмрдирд╛рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ):
  try { Class customHandle = Class.forName("groovy.runtime.metaclass.CustomMetaClassCreationHandle"); this.handle = customHandle.newInstance(); } catch (ClassNotFoundException e) { // custom handler,    this.handle = new MetaClassCreationHandle(); } 

"рд╢рд░реНрд▓рдХ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рд╣реИ?"
"рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ, рд╡рд╛рдЯрд╕рди рд╣реИред" рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдЕрдкрдирд╛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕рдХреНрд░реАрдЯрд┐рдпрдирд╣реИрдВрдбрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдореЗрдЯрд╛рдХрд╛рд▓реЗрд╕ рдХреЛ рдирдП рддрд░реАрдХреЛрдВ рдФрд░ рдЬреЗрд╕рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдВрдЧреЗред
рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЧреНрд░реВрд╡реА "groovy.runtime.metaclass.CustomMetaClassCreationHandle" рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЙрд╕реЗ рджреЗ рджреЗрдВрдЧреЗ:
 public class CustomMetaClassCreationHandle extends MetaClassRegistry.MetaClassCreationHandle { protected MetaClass createNormalMetaClass(Class theClass, MetaClassRegistry registry) { Package thePackage = theClass.getPackage(); if (thePackage != null && thePackage.getName().equals("model")) { return new Jsonizer(theClass); } else { return super.createNormalMetaClass(theClass, registry); } } } 

рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдкреИрдХреЗрдЬ - рдЕрдкрдирд╛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рджреЗрдВ, рдпрджрд┐ рдирд╣реАрдВ - рджреЗрд╢реАред рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ - рдСрдлрд╕реЗрдЯред
рдирд┐рд░рд╛рд▓рд╛ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╕рд╣реА рд╣реИ, CustomMetaClassCreationHandle рдХреЛ Java рдХреНрд▓рд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╛ рдХрд┐ Groovy, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдБ рдПрдХ рдЪрд┐рдХрди рдФрд░ рдПрдХ рдЕрдВрдбрд╛ рд╣реИ - Groovy рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА MetaClassCreationHandle рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд (рдЙрджрд╛рд╣рд░рдг) рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ, рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдПрдХ рдЫреЛрдЯреА рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  1. ExpandoMetaClass рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ (рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)
  2. ToJson рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ Json-lib th рдЗрд╕ рдХреЛ json string рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ
  3. рдПрдХ рд╕реНрдерд┐рд░ parseJson рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ Json-lib th рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП json рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ deserialize рдХрд░рддрд╛ рд╣реИ

рдФрд░ рдпрд╣рд╛рдВ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдкрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЙрддреНрддрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ (рдЕрднрд┐рдпрд╛рди, рдореБрдЭреЗ рд╕реВрдЪреА рдкрд╕рдВрдж рд╣реИ) :

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
(рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреБрддреНрддреЗ" рдХрд╛ рдирдпрд╛ рдкреНрд░рд╕реНрддреБрдд рд╕рдорд░реНрдерди рдПрдиреЛрдЯреЗрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдХреНрдпрд╛" рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рдЖрдк рд╕реНрд╡рдпрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВред)
 groovy.lang.Grapes([ GrabResolver(name = 'rjo', root = 'http://repo.jfrog.org/artifactory/libs-releases'), Grab(group = 'net.sf.json-lib', module = 'json-lib', version = '2.4', classifier = 'jdk15')]) class Jsonizer extends ExpandoMetaClass { Jsonizer(Class theClass) { super(theClass) toJson << {-> fromObject(delegate).toString() } static.parseJson << {String json -> toBean(fromObject(json), theClass); } } } 

рдЦреИрд░, рдЖрдо рддреМрд░ рдкрд░ рд▓рд╛рднред рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕, рдХреНрд▓реЙрдХ рдФрд░ рд░реЗрдбрд┐рдпреЛ рдиреЗ рддрд░реАрдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рд╣реИрдВ, рд╕реЗрд╡рд╛ рдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ред


  1. рдпрджрд┐ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ "рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпрд╛ рд╣реИ, рдФрд░ / рдпрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдпрд╣рд╛рдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдЬрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ", рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред
  2. рдЧреНрд░реВрд╡реА рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рдЧреНрд░реВрд╡реА рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА (рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдврддреЗ рд╣реИрдВ, рддреЛ JIRA рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдЦреЛрд▓реЗрдВ, рдФрд░ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдПрдВрдЧреЗ)ред

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


All Articles