
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдбрд┐рдЬрд╛рдЗрди рд╢реИрд▓реА рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рджрд░реНрдЬрдиреЛрдВ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╕реАрдзрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд▓рддреА рд╣реБрдИ рдЗрдЪреНрдЫрд╛ рд╕реЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдИ рдорд╣реАрдиреЛрдВ рдХреЗ рджрд░реНрдж рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдб рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдЪрд╛рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЬреАрдердм рд▓рд┐рдВрдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛
рдпрджрд┐ рдЖрдкрдХреЛ рдХрднреА рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЬреВрдЭрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ (рдЬреЛ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ: рдпреВрдирд┐рдЯ-рдЯреЗрд╕реНрдЯ, рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдирд▓ рдпрд╛ рдлрдВрдХреНрд╢рдирд▓), рддреЛ рд╡реЗ рдХреНрд░рдорд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рд▓рдЧрднрдЧ рдПрдХ рд╣рдЬрд╛рд░ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдХреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝рддреА рдЧрдИ, рд╣рдордиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдордВрджреА рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛: рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЙрддрдирд╛ рд╣реА рд╕рдордп рд▓рдЧреЗрдЧрд╛ рдЬрд┐рддрдирд╛ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВред
рдирдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдкрдбрд╝рддрд╛ рдерд╛, рдЖрдорддреМрд░ рдкрд░ рдкрдбрд╝реЛрд╕реА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЪрд░рдгреЛрдВ рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдХреЗред рдирддреАрдЬрддрди, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рддреЛ рдХрд╛рд░реНрдб рдХрд╛ рдШрд░ рдЙрдЦрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдореЗрдВ рд╣рд░ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рд╛ рдХреА рдорд░рдореНрдордд рдХрд░рдиреА рд╣реЛрдЧреА: рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ - рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЧрд╣рд░рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдХрд░ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред
рдЬрдм рдПрдХ рдкрд░реАрдХреНрд╖рдг "рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ" рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рдЕрд░реНрдерд╛рдд рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЧ рдХреЗ рдХрд╛рд░рдг - рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖ рдЕрд╕рдВрднрд╡ рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛, рдХрд┐рд╕реА рдХреЛ рднреА рдкреВрд░реНрдг рдЬреНрдЮрд╛рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рджрд░реНрдж рдХреЗ рд╕рднреА, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдбрд┐рдЬрд╛рдЗрди рдХреА рджреЛ рдЧрд╣рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИ:
- рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИред рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╣рд┐рдордкрд╛рдд рдХрд╛ рдПрдХ рдЦрдВрдб рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреА рдХрдореА рд╕реЗ рд╡рд╛рдЪрд╛рд▓рддрд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕рдордп рдЦрд╛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдзреНрд╡рд╕реНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдорд╣рддреНрд╡рд╣реАрди рд╡рд┐рд╡рд░рдг рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпрд╛ рд╣реИ - рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддреА рд╣реИред рдирдХрд▓ рдФрд░ рдЪрд┐рдкрдХрд╛рдирд╛ рдирдП рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрди рдЬрд╛рддрд╛ рд╣реИред
- рдЯреЗрд╕реНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рджреЛрд╖реЛрдВ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ; рд╡реЗ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рд╕рд╛рдЬрд┐рд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореЛрдбрд▓рд┐рдВрдЧ
рдХреНрдпрд╛ рд╣рдо рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? (рд╕реНрдкреЙрдпрд▓рд░ рдЕрд▓рд░реНрдЯ: рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред) рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
val db: Database = Database.forURL(TestConfig.generateNewUrl()) migrateDb(db) insertUser(db, id = 1, name = "test", role = "customer") insertPackage(db, id = 1, name = "test", userId = 1, status = "new") insertPackageItems(db, id = 1, packageId = 1, name = "test", price = 30) insertPackageItems(db, id = 2, packageId = 1, name = "test", price = 20) insertPackageItems(db, id = 3, packageId = 1, name = "test", price = 40)
рдЕрдВрдЧреВрдареЗ рдХреЗ рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ (рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЖрдХрд╛рд░, рдорд╛рддреНрд░рд╛, рдлрд┐рд▓реНрдЯрд░, рдХреБрдЫ рдХрд╛ рдирд╛рдо), рд╕рд╛рде рд╣реА рдХреБрдЫ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ (рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕, рдХрддрд╛рд░ рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╕реЗрд╡рд╛ рд╕реЗ) рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред рдордЬрд╝рдмреВрддреА рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╕рд┐рд╕реНрдЯрдо, рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛, рдпрд╛ рджреЛрдиреЛрдВ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬреНрдпред
рдЗрд╕ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рднрд░реЗрдВ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдХрддрд╛рд░ рдмрдирд╛рдПрдВ рдЖрджрд┐ред
val svc = new SomeProductionLogic(db) val result = svc.calculatePrice(packageId = 1)
рдХреБрдЫ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рджреЛрдиреЛрдВ рд╕реНрдкрд╖реНрдЯ (рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛) рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд (рд░рд╛рдЬреНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди)ред
result shouldBe 90
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЕрднрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░рдирд╛ред

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

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

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЛ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреНрд░рдордг рджреНрд╡рд╛рд░рд╛ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдВрддрд┐рдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдХреА рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ (рдЪрд▓реЛ рдЗрд╕реЗ prepare
), рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди ( execute
) рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо ( check
) рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЗрд╕ рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдмрд╣реБрдд рдкрд╣рд▓рд╛ рдХрджрдо рд╣реЛрдЧрд╛ - рд╕реНрдерд┐рд░рддрд╛ред рдЪрд▓реЛ рдкрд░рд┐рдгрд╛рдореА рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВ ред
рдЬреАрд╡рди рдЪрдХреНрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ def runTestCycle[FX, DEP, OUT, F[_]]( fixture: FX, prepare: FX => DEP, execute: DEP => OUT, check: OUT => F[Assertion] ): F[Assertion] =
рдПрдХ рдкреНрд░рд╢реНрди рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдХреБрдЫ рдХрд╛рд░реНрдп рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рддрд░реАрдХреЗ рд╣реИрдВ - рдбреЗрдЯрд╛рдмреЗрд╕ рднрд░рдирд╛, рдореЙрдХрд┐рдВрдЧ рдХрд░рдирд╛ рдЖрджрд┐ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП prepare
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдирддреАрдЬрддрди, рд╣рд░ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЬреЛ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдФрд░ рджрд╛рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг (рдпрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдореВрд╣) рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП execute
рдФрд░ check
рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рдорд╛рд░реЛрд╣ рдПрдХ DB рдкрд░ рдЕрдВрддрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╕рднреА рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд╕реМрдВрдкрдиреЗ рд╕реЗ, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдЪрд░рдг рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓ рдпрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдмреЗрд╣рддрд░ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреА рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ - рдкрд┐рдирдкреЙрдЗрдВрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореАред рдЬреЛ рднреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВред рд╣рдорд╛рд░рд╛ рд▓реЙрдЧрд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛; рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдЗрдб-рдЗрдлрд╝реЗрдХреНрдЯ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЙрд╕реА рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рдЪрдХреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ def logged[T](implicit loggedT: Logged[T]): T => T = (that: T) => {
рдЗрд╕ рд╕рд░рд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИред рдРрд╕реЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ рддрдм рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
val fixture: SomeMagicalFixture = ???
рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╢рд░реАрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рдЧрдпрд╛, рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдЬрд╛рдВрдЪ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рднреА рддреИрдпрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ ...
рд╕реНрдерд┐рд░рддрд╛ рддреИрдпрд╛рд░реА
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╣рдо рдПрдХ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рд╣рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рджреА рдЬрд╛рдПрдЧреАред рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд░реНрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХрд╛ рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХреА рдХреЗрд╡рд▓ 4 рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдбреЗрдЯрд╛, рдХреБрдЫ - рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдмрдВрдз рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдПрдХ Bonus
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ Package
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ User
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдФрд░ рд╣реИрдХреНрд╕ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдЬрдиреНрдо рджреЗрддреЗ рд╣реИрдВ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдШрдВрдЯреЛрдВ рддрдХред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╣рдо рдЗрд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрддреНрдкрд╛рджрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдерд▓реА рдЬрд╛рдВрдЪ рдХреЗ рддрд╣рдд, рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИред рдЙрд╕ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдбреЗрдЯрд╛ рдХреНрдпрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рд╣рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЙрд╕ рдХреЛрдб рдХрд╛ рдЕрдиреБрдмрдВрдз рдмрджрд▓ рдЬрд╛рдП? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ? рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рднрд░рдирд╛ insertUser(db, id = 1, name = "test", role = "customer") insertPackage(db, id = 1, name = "test", userId = 1, status = "new") insertPackageItems(db, id = 1, packageId = 1, name = "test", price = 30) insertPackageItems(db, id = 2, packageId = 1, name = "test", price = 20) insertPackageItems(db, id = 3, packageId = 1, name = "test", price = 40)
рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЗ, рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдЖрдбрд╝ рдореЗрдВ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИред рд╡реЗ рд╕реНрд╡рдпрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╣рдо рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рд╕рд╣реА рдЙрдореНрдореАрджрд╡рд╛рд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ (рдпрд╛ рдкреАрдПрдЪрдкреА рдпрд╛ рдкрд╛рдЗрдерди рдХреА рддрд░рд╣ рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ ) рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЗрдХрд┐рди рдлрд╝реАрд▓реНрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛: рд╣рдо рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдмрджрд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:
val dataTable: Seq[DataRow] = Table( ("Package ID", "Customer's role", "Item prices", "Bonus value", "Expected final price") , (1, "customer", Vector(40, 20, 30) , Vector.empty , 90.0) , (2, "customer", Vector(250) , Vector.empty , 225.0) , (3, "customer", Vector(100, 120, 30) , Vector(40) , 210.0) , (4, "customer", Vector(100, 120, 30, 100) , Vector(20, 20) , 279.0) , (5, "vip" , Vector(100, 120, 30, 100, 50), Vector(10, 20, 10), 252.0) )

рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ, рд╣рдо рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХреБрдВрдЬреА - рдЗрдХрд╛рдИ рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдПрдХ рдЗрдХрд╛рдИ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рддреЛ рджреВрд╕рд░реА рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрдВрдЬреА рднреА рдмрди рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдерд╛рдПрдВ рдПрдХ рд╣реА рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдХреБрдВрдЬреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╕реНрддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕рднреА рдЖрдИрдбреА рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдорд░реНрдкрдг рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ Set
ред рдпрджрд┐ рдпрд╣ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрд╢рд┐рдпрд╛рд░ рдХрдЯреМрддреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдВрдЬреА (рдЙрджрд╛рд╣рд░рдг) sealed trait Key case class PackageKey(id: Int, userId: Int) extends Key case class PackageItemKey(id: Int, packageId: Int) extends Key case class UserKey(id: Int) extends Key case class BonusKey(id: Int, packageId: Int) extends Key
рдЦреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд░реНрдЬреА рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ (рдЬреИрд╕реЗ, рдирд╛рдо) рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╡рд░реНрдЧ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рд░реЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВред
рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рдЙрджрд╛рд╣рд░рдг) object SampleData { def name: String = "test name" def role: String = "customer" def price: Int = 1000 def bonusAmount: Int = 0 def status: String = "new" } sealed trait Row case class PackageRow(id: Int, name: String, userId: Int, status: String) extends Row case class PackageItemRow(id: Int, packageId: Int, name: String, price: Int) extends Row case class UserRow(id: Int, name: String, role: String) extends Row case class BonusRow(id: Int, packageId: Int, bonusAmount: Int) extends Row
рдирдХрд▓реА рдбреЗрдЯрд╛ рдЖрдорддреМрд░ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдВрд╕ рдХреЗрд╡рд▓ рд╡реЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рднреА рдирд┐рд░реНрдорд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд▓реЗрдВрд╕ рднреЗрд╕ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдирдХрд╛ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдмрд┐рдВрджреБ рд╣реИред
рд▓реЗрдВрд╕ (рдЙрджрд╛рд╣рд░рдг) def changeUserRole(userId: Int, newRole: String): Set[Row] => Set[Row] = (rows: Set[Row]) => rows.modifyAll(_.each.when[UserRow]) .using(r => if (r.id == userId) r.modify(_.role).setTo(newRole) else r)
рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рдФрд░ рд╕реБрдзрд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдкреВрд░реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ INSERT
рд╕рд╛рде рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдерд┐рд░рддрд╛ рддреИрдпрд╛рд░реА рд╕рдорд╛рд░реЛрд╣ def makeFixture[STATE, FX, ROW, F[_]]( state: STATE, applyOverrides: F[ROW] => F[ROW] = x => x ): FX = (extractKeys andThen deduplicateKeys andThen enrichWithSampleData andThen applyOverrides andThen logged andThen buildFixture) (state)
рдЕрдВрдд рдореЗрдВ, рдкреВрд░реА рдЪреАрдЬ рд╣рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реА, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╕рднреА рд╡рд┐рд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред

рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
val dataTable: Seq[DataRow] = Table( ("Package ID", "Customer's role", "Item prices", "Bonus value", "Expected final price") , (1, "customer", Vector(40, 20, 30) , Vector.empty , 90.0) , (2, "customer", Vector(250) , Vector.empty , 225.0) , (3, "customer", Vector(100, 120, 30) , Vector(40) , 210.0) , (4, "customer", Vector(100, 120, 30, 100) , Vector(20, 20) , 279.0) , (5, "vip" , Vector(100, 120, 30, 100, 50), Vector(10, 20, 10), 252.0) ) "If the buyer's role is" - { "a customer" - { "And the total price of items" - { "< 250 after applying bonuses - no discount" - { "(case: no bonuses)" in calculatePriceFor(dataTable, 1) "(case: has bonuses)" in calculatePriceFor(dataTable, 3) } ">= 250 after applying bonuses" - { "If there are no bonuses - 10% off on the subtotal" in calculatePriceFor(dataTable, 2) "If there are bonuses - 10% off on the subtotal after applying bonuses" in calculatePriceFor(dataTable, 4) } } } "a vip - then they get a 20% off before applying bonuses and then all the other rules apply" in calculatePriceFor(dataTable, 5) }
рдФрд░ рд╕рд╣рд╛рдпрдХ рдХреЛрдб:
рд╣реЗрд▓реНрдкрд░ рдХреЛрдб рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирдП рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдлреНрд░рд┐рдВрдЬ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рди рдХрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдкрд░ред
рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рддреИрдпрд╛рд░реА
рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреБрдбрд╝рдирд╛рд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдб рд▓рд┐рдЦрд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╣рдо рд╣рд░ рдмрд╛рд░ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░реНрдмрд╛рдж рд╣реЛрддреЗ рд╣реИрдВ?
рд╣рдо рдПрдХ рдареЛрд╕ рдбреЛрдореЗрди рдореЙрдбрд▓ рдкрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреА рддреИрдпрд╛рд░реА рдХреЛ рдЕрдореВрд░реНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реЗрдХрд▓реНрд╕ рдХреА рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рд╡реЗ рдУрдУрдкреА рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╡реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдореВрд╣ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓рднреВрдд рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЪрд░ рдХреА рддрд░рд╣ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рдорд╛рди, рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХреЛ рдХреЛрдЯрд▓рд┐рди рдФрд░ рд╕реА # рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдлрд╝реАрд▓реНрдбреНрд╕ рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ log()
ред рдПрдХ Logged
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╣рд░ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдердХрд╛рдК рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рдорд╛рдирдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдо рдПрдХ рдЯрд╛рдИрдкреЗрдХреЗрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ Logged
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдорд╛рдирд╡-рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдПред рдмрд╛рдХреА рд╕рдм рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ Logged
рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд╣рдо рдПрдХ рдлреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Any
рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ Any
рдорд╛рдирдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ toString()
рдлреНрд░реА рдореЗрдВ рдЙрдирдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд▓реЙрдЧ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдФрд░ рдЙрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг trait Logged[A] { def log(a: A)(implicit logger: Logger): A }
рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЬреБрдбрд╝рдирд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреБрдбрд╝рдирд╛рд░ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯрд▓реНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░ рддрд░реАрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рд░рддрд╛ рддреИрдпрд╛рд░реА рдЙрдкрдХрд░рдг рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рдХреЗ рд░реВрдк рдореЗрдВ SOLID рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рд╣реИ:
- рд╕рд┐рдВрдЧрд▓ рд░рд┐рд╕реНрдкрд╛рдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рд╕рд┐рджреНрдзрд╛рдВрдд : рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
- рдЦреБрд▓реЗ / рдмрдВрдж рд╕рд┐рджреНрдзрд╛рдВрдд : рд╣рдо рдЙрддреНрдкрд╛рджрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рддреЗ рд╣реИрдВред
- Liskov рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣рд╛рдБ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рд╕рд┐рджреНрдзрд╛рдВрдд : рд╣рдо рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдПрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд╛рдЗрдкрдХрд╛рд▓реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓рдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд : рд╕реНрдерд┐рд░рддрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдореВрд░реНрдд рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯреЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╕рднреА рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рдорд╛рд░реЛрд╣ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рддреИрдпрд╛рд░реА рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдХрд┐рд╕реА рднреА рджрд┐рдП рдЧрдП рдЖрд╡реЗрджрди рдкрд░ рдПрдХ рдареЛрд╕ рдбреЛрдореЗрди рдореЙрдбрд▓ рд╕реЗ рднреА рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рд╣рдо рд╢реЗрд╖ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛
рд╣рдордиреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ (рдЪрд░рдг-рджрд░-рдЪрд░рдг) рдкрд░реАрдХреНрд╖рдг рдбрд┐рдЬрд╛рдЗрди рд╢реИрд▓реА рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╢реИрд▓реА рд╢реБрд░реБрдЖрддреА рдФрд░ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдРрд╕реА рд╢реИрд▓реА рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╢рд╛рдпрдж рдЖрдкрдХреА рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реИрдХрдбрд╝реЛрдВ рдпрд╛ рд╣рдЬрд╛рд░реЛрдВ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкрд░реАрдХреНрд╖рд╛рдПрдВ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ (рдЬреИрд╕реЗ рдбреЗрдЯрд╛, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб, рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо) рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдгреЛрдВ рдкрд░ рдирд╣реАрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрдВрдкреЛрдЬрд┐рд╢рди рдФрд░ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯреЗрд╕ рдХрд┐рддрдиреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреА рдорджрдж рд╕реЗ, рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдорди рдореЗрдВ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рдХрдИ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╢реИрд▓реА рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдорд╛рд░реА рдЯреАрдо рдХреЛ рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ред рдирдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЙрдЧ рдЬреАрд╡рди рдХреЛ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рднреА рдХреБрдЫ рддрд░реНрдХ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдЯреАрдо рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдЗрд╕ рдирдИ рд╢реИрд▓реА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдФрд░ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЬреАрдердм ред рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдордЬрд╝реЗ рдХрд░реЛ!