рдбреЗрдЯрд╛ рдореИрдкрд┐рдВрдЧ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛрдб рдХреЛ рд▓реЗрдпрд░реНрд╕ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди Android- CleanArchitecture рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрджрд╛рд╣рд░рдг рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг ( CleanArchitecture рд╕реЗ рдореИрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг ) рдФрд░ рдирдП Kotlin рд╕рдВрд╕реНрдХрд░рдг ( рдПрдХ рдореИрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг ) рджреЛрдиреЛрдВ рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдореИрдкрд┐рдВрдЧ рд╕реЗ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд░рддреЛрдВ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреАрдЖрдИ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ), рд╕рд░рд▓ рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВред
рдЪрд┐рддреНрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбрд▓ рд╕рд░рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред Person
рдХреЗ рдЖрд╡реЗрджрди рдХреА рджреЛрдиреЛрдВ рдкрд░рддреЛрдВ рдореЗрдВ Salary
рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдореЙрдбрд▓ рд╣реИ, рддреЛ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд░рддреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдзрд┐ # 1: рдореИрдкрд░ рддрд░реАрдХреЗ
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class PersonSrc( private val name: String, private val salary: SalarySrc ) { fun mapToDestination() = PersonDst( name, salary.mapToDestination()
рд╕рдмрд╕реЗ рддреЗрдЬ рдФрд░ рдЖрд╕рд╛рди рд╡рд┐рдзрд┐ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ CleanArchitecture Kotlin ( рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдкреНрд▓рд╕ рдЦреЗрддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред PersonSrc
рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ private
рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХреЛрдб PersonSrc
рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, PersonSrc
рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЛрдб рдЬреБрдЯрдирд╛ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реИ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ - рдлрд╝реАрд▓реНрдб рдШреЛрд╖рдгрд╛рдПрдБ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИред рд╡рд░реНрдЧ рдлрд╝реАрд▓реНрдб рдмрджрд▓рддреЗ рд╕рдордп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИред PersonSrc рд╡рд░реНрдЧ рдХреЗ рдореИрдкрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдореИрдкрд░ рд╡рд┐рдзрд┐ SalarySrc
рд▓рд┐рдП PersonSrc
рдХреЙрд▓ PersonSrc
ред рдЗрд╕рд▓рд┐рдП Salary
рдореИрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ Person
рдореИрдкрд┐рдВрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрдард┐рди рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдореЛрдХреА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрдЧрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрд╡реЗрджрди рдкрд░рддреЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреА рд╣реИрдВ: рдЕрд░реНрдерд╛рддреНред рдХрд┐рд╕реА рд▓реЗрдпрд░ рдХреЗ Src
рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдк Dst
рд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдкрд┐рдВрдЧ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╛рдирд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, Src
рдкрд░рдд Dst
рдкрд░рдд рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░рдд рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреА рд╣реИред рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП (рдЬрдм Dst
Src
рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ), рд╕реНрдереИрддрд┐рдХ рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рд╣реИ:
class PersonDst( private val name: String, private val salary: SalaryDst ) { companion object { fun fromSource( src: PersonSrc ) = PersonDst(src.name, SalaryDst.fromSource(src.salary)) } } class SalaryDst( private val amount: Int ) { companion object { fun fromSource(src: SalarySrc) = SalaryDst(src.amount) } }
рдореИрдкрд┐рдВрдЧ Dst
рдкрд░рдд рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпреЗ рдХрдХреНрд╖рд╛рдПрдВ рдЙрдирдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЙрди рд╕рднреА рдХреЛрдб рдХреЛ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдкрд░рдд рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рддреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрдереИрддрд┐рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред
рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рдзрд┐ рд╕рд╛рд░рд╛рдВрд╢:
+
рдЬрд▓реНрджреА рд╕реЗ рдХреЛрдб рд▓рд┐рдЦреЗрдВ, рдореИрдкрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рд╣рд╛рде рдореЗрдВ рд╣реИ
+
рдЖрд╕рд╛рди рд╕рдВрд╢реЛрдзрди
+
рдХрдо рдХреЛрдб рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА
-
рдХрдард┐рди рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг (рдореЛрдХреА рдЖрд╡рд╢реНрдпрдХ)
-
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрд╢рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ
рд╡рд┐рдзрд┐ 2: рдореИрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕
рдореЙрдбрд▓:
class PersonSrc( val name: String, val salary: SalarySrc ) class SalarySrc(val amount: Int) class PersonDst( val name: String, val salary: SalaryDst ) class SalaryDst(val amount: Int)
рдорд╛рдирдЪрд┐рддреНрд░рдХрд╛рд░реЛрдВ:
fun mapPerson( src: PersonSrc, salaryMapper: (SalarySrc) -> SalaryDst = ::mapSalary
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, mapPerson
рдмрд╛рдж рд╕реЗ рдПрдХ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЙрд╕реЗ Salary
рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдореИрдкрд░ рдорд┐рд▓рддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореИрдкрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдореИрдкрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдкрд░ рдФрд░ рдЬрд┐рди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд░рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдореИрдкрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рд╕рднреА рдкреНрд░реЙрдкрд░реНрдЯреА рдореИрдкрд░ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗ, рдЕрд░реНрдерд╛рдд private
рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рдзрд┐ рд╕рд╛рд░рд╛рдВрд╢:
+
рд╕рд░рд▓ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
-
рдХрдард┐рди рд╕рдВрд╢реЛрдзрди
-
рдбреЗрдЯрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╡рд┐рдзрд┐ 3: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕
рдорд╛рдирдЪрд┐рддреНрд░рдХрд╛рд░реЛрдВ:
fun PersonSrc.toDestination( salaryMapper: (SalarySrc) -> SalaryDst = SalarySrc::toDestination ): PersonDst { return PersonDst(this.name, salaryMapper.invoke(this.salary)) } fun SalarySrc.toDestination(): SalaryDst { return SalaryDst(this.amount) }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдкрд░ рдХреЙрд▓ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд░рд▓ рд╣реЛрддрд╛ рд╣реИ: .toDestination()
ред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЙрдирдХреЗ рд╕реНрдерд┐рд░ рд╕реНрд╡рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-stively
рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рдзрд┐ рд╕рд╛рд░рд╛рдВрд╢:
+
рд╕рд░рд▓ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
-
рдХрдард┐рди рд╕рдВрд╢реЛрдзрди
-
рдбреЗрдЯрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╡рд┐рдзрд┐ 4: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдореИрдкрд░ рдХреНрд▓рд╛рд╕реЗрд╕
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдЦрд╛рдореА рд╣реИред рд╡реЗ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (SalarySrc) -> SalaryDst
рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред Mapper<SRC, DST>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
interface Mapper<SRC, DST> { fun transform(data: SRC): DST } class PersonMapper( private val salaryMapper: Mapper<SalarySrc, SalaryDst> ) : Mapper<PersonSrc, PersonDst> { override fun transform(src: PersonSrc) = PersonDst( src.name, salaryMapper.transform(src.salary) ) } class SalaryMapper : Mapper<SalarySrc, SalaryDst> { override fun transform(src: SalarrSrc) = SalaryDst( src.amount ) }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, SalaryMapper
рдПрдХ PersonMapper
рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП Salary
рдореИрдкрд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рджреЛрд╖ рд╣реИ - рдереЛрдбрд╝рд╛ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред
рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рдзрд┐ рд╕рд╛рд░рд╛рдВрд╢:
+
рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ
-
рдЕрдзрд┐рдХ рдХреЛрдб
рдореИрдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣:
+
рд╕рд░рд▓ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
-
рдХрдард┐рди рд╕рдВрд╢реЛрдзрди
-
рдбреЗрдЯрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╡рд┐рдзрд┐ 5: рдкрд░рд╛рд╡рд░реНрддрди
рдХрд╛рд▓реЗ рдЬрд╛рджреВ рдХреА рд╡рд┐рдзрд┐ред рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдкрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдореЙрдбрд▓:
data class EmployeeSrc( val firstName: String, val lastName: String, val age: Int
рдореИрдкрд░:
fun EmployeeSrc.mapWithRef() = with(::EmployeeDst) { val propertiesByName = EmployeeSrc::class.memberProperties.associateBy { it.name } callBy(parameters.associateWith { parameter -> when (parameter.name) { EmployeeDst::name.name -> "$firstName $lastName"
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдЬрд╛рд╕реВрд╕реА рд╣реИ ред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, EmployeeSrc
рдФрд░ EmployeeDst
рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдирд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдкрд░ рдХреЛ рдХреЗрд╡рд▓ рдирдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреЛрдб рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ ( else
рд╡рд┐рдХрд▓реНрдк when
)ред
рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЦреЗрддреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдореЙрдбрд▓ рд╣реИрдВ рдФрд░ рдлрд╝реАрд▓реНрдб рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА, рдпрджрд┐ рдЖрдк Dst рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ Src
рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛ рдореЗрдВ рдореИрдкрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдХреНрд░рдо рдореЗрдВ рдПрдХ IllegalArgumentException
ред рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рднреА рд╣реИрдВред
рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рдзрд┐ рд╕рд╛рд░рд╛рдВрд╢:
+
рдХрдо рдХреЛрдб
+
рд╕рд░рд▓ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
-
рдЦрддрд░рдирд╛рдХ
-
рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рдореИрдкрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ - рд╕реНрдкрд╖реНрдЯ рдХреЛрдб, рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝
рдореИрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ - рдмрд╕ рдЯреЗрд╕реНрдЯ рдореИрдкрд┐рдВрдЧред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдореИрдкрд░ рдХрдХреНрд╖рд╛рдПрдВ - рдмрд╕ рдореИрдкрд┐рдВрдЧ рдФрд░ рдХреНрд▓рд┐рдпрд░ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
рдкреНрд░рддрд┐рдмрд┐рдВрдм - рдЧреИрд░-рдорд╛рдирдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрддред