рд╡реНрд╣рд╛рдЗрдЯ рдмреЙрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг

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


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


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


рдХрдЯ рдХреЗ рддрд╣рдд, рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА (рднрд╛рдЧреАрджрд╛рд░реА) рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдХрд╡рд░реЗрдЬ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


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


рдЯреЗрд╕реНрдЯ рдмреЗрдВрдЪ


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


 case class TestCase[A, B](label: String, input: A, expectedOutput: B) 

рдПрдХ рд░рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ TestCaseResult рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 case class TestCaseResult[A, B](testCase: TestCase[A, B], actualOutput: Try[B]) 

(рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА Try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдиреНрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред)


рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд░рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:


 def runTestCases[A, B](cases: Seq[TestCase[A, B])(f: A => B): Seq[TestCaseResult[A, B]] = cases .map{ testCase => TestCaseResult(testCase, Try{ f(testCase.input) } ) } .filter(r => r.actualOutput != Success(r.testCase.expectedOutput)) 

рдпрд╣ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдЙрдореНрдореАрдж рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред


рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 def report(results: Seq[TestCaseResult[_, _]]): String = s"Failed ${results.length}:\n" + results .map(r => r.testCase.label + ": expected " + r.testCase.expectedOutput + ", but got " + r.actualOutput) .mkString("\n") 

рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ:


 val testCases = Seq( TestCase("1", 0, 0) ) test("all test cases"){ val testBench = runTestCases(testCases) _ val results = testBench(f) assert(results.isEmpty, report(results)) } 

рдЗрдирдкреБрдЯ рддреИрдпрд╛рд░ рдХрд░рдирд╛


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


 val baseline = MyObject(...) //        val testCases = Seq( TestCase("baseline", baseline, ???), TestCase("baseline + (field1 = 123)", baseline.copy(field1 = "123"), ???) ) 

рдиреЗрд╕реНрдЯреЗрдб рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд▓реЗрдВрд╕ рдмрд╣реБрдд рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЛрдиреЛрдХрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ:


 val baseline = ??? val testObject1 = (field1 composeLens field2).set("123")(baseline) //    : val testObject1 = baseline.copy(field1 = baseline.field1.copy(field2 = "123")) 

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


рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП DSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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


 val testCases = Seq( TestCase("baseline", baseline, ???), TestCase("baseline + " + "(field1 = 123) + " + //  1-  "(field2 = 456) + " + // 2- "(field3 = 789)", // 3- baseline .copy(field1 = "123") // 1-  .copy(field2 = "456") // 2-  .copy(field3 = "789"), // 3-  ???) ) 

рдлрд┐рд░ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рддрд╛рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкрд╛рдареНрдп рд╕реВрдЪреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЕрд▓рдЧ рди рд╣реЛ, рдЖрдкрдХреЛ "рд╕рддреНрдп рдХреЗ рдПрдХрд▓ рд╕рдВрд╕реНрдХрд░рдг" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред (рдпрджрд┐ рдПрдХ рд╣реА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ / рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрджреНрд╡рд┐рддреАрдп рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рд╛рдердорд┐рдХ рд╕реНрд░реЛрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдореИрдиреНрдпреБрдЕрд▓ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред ред рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛, рд╣рдо рдПрдХ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛ рдХреЗ рд╡рд░реНрдгрди рдореЗрдВ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рд╕рдВрдЧрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА -ред рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдХреЙрдкреА field2 = "456" рдФрд░ рдореЗрдВ рдпрд╣ рдПрдбрдЬрд╕реНрдЯ рдХрд░рдиреЗ field3 = "789" рд╣рдо Mauger рдЧрд▓рддреА рд╕реЗ рд╡рд░реНрдгрди рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╡рд░реНрдгрди рдХреЗрд╡рд▓ рддреАрди рдореЗрдВ рд╕реЗ рджреЛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ред)


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


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


рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП:


  1. рд╕реНрдкреЙрди рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдгред (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪреА рдмрдирд╛ рд░рд╣рд╛ рд╣реИред)
  2. рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЧрдардиред
  3. рдбреЛрдореЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдирд╛ред
  4. рдореЙрдбрд▓ рдкрд░ рдЕрдиреБрдХреВрд▓рди рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ред

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


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


рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдмрджрд▓реЗрдВ

рдкрд░рд┐рд╡рд░реНрддрди рднрд╛рд╖рд╛ рдПрдХ рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, nontrivial рд╣реИрдВред


  1. рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЙрдбрд▓ред
  2. рдореЙрдбрд▓ рдмрджрд▓реЗрдВред
  3. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдВрдмреЗрдбреЗрдб (?) рдбреАрдПрд╕рдПрд▓ - рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрдорд╛рдг, рд╡рд┐рд╕реНрддрд╛рд░-рд╡рд┐рдзрд┐рдпрд╛рдВред
  4. рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕рдВрд╢реЛрдзрд┐рдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ)ред

рдпрд╣рд╛рдВ DSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 val target: Entity[Target] // ,     val updateField1 = target \ field1 := "123" val updateField2 = target \ subobject \ field2 := "456" // ,   DSL: val updateField1 = SetProperty(PropertyAccess(target, Property(field1, typeTag[String])), LiftedString("123")) val updateField2 = SetProperty(PropertyAccess(PropertyAccess(target, Property(subobject, typeTag[SubObject])), Property(field2, typeTag[String])), LiftedString("456")) 

рдЕрд░реНрдерд╛рдд, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдердбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ \ рдФрд░ := , PropertyAccess , SetProperty рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП target , SetProperty , SetProperty , SetProperty рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдмрдирддреЗ field2 ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, (рдЦрддрд░рдирд╛рдХ) рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг, рд╕реНрдЯреНрд░рд┐рдВрдЧ "123" рдХреЛ рдПрдХ LiftedString рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЖрдк рдмрд┐рдирд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: lift("123") )ред


рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдСрдиреНрдХреЛрд▓реЙрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( https://habr.com/post/229035/ рдФрд░ https://habr.com/post/222553/ рджреЗрдЦреЗрдВ )ред (рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдирд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЛрдореЗрди рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ: val field1: Property[Target, String] ред) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдХреЗ рд░реВрдк рдореЗрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдСрдиреНрдХреЛрд▓реЙрдЬреА рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдЖрдорддреМрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдСрдиреНрдХреЛрд▓реЙрдЬреА рдХреЗрд╡рд▓ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕реА рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдКрдкрд░ SetProperty рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ:


  • Modify - рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ,
  • Changes - рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрдИ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдирд╛
  • ForEach - рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ,
  • рдЖрджрд┐

рдкрд░рд┐рд╡рд░реНрддрди рднрд╛рд╖рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреИрдЯрд░реНрдирдореИрдЪрд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:


 def eval(expression: DslExpression, gamma: Map[String, Any]): Any = expression match { case LiftedString(str) => str case PropertyAccess(obj, prop) => Getter(prop)(gamma).get(obj) } def change[T] (expression: DslChangeExpression, gamma: Map[String, Any], target: T): T = expression match { case SetProperty(path, valueExpr) => val value = eval(valueExpr, gamma) Setter(path)(gamma).set(value)(target) } 

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


рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдореЙрдбрд▓ рдХреБрдЫ рд╣рдж рддрдХ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдЙрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдиреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, field1 = field2 + 1 ), рддреЛ рдЖрдкрдХреЛ рдбреАрдПрд╕рдПрд▓ рд╕реНрддрд░ рдкрд░ рдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдирдЧрдгреНрдп рд╣реИ, рддреЛ рдбреАрдПрд╕рдПрд▓ рд╕реНрддрд░ рдкрд░, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╢рд╛рдЦрд╛ рдкрд░реАрдХреНрд╖рдг


рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд░реИрдЦрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, рдмрдбрд╝реЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╢рд╛рдЦрд╛ рд╣реИ ( if-then-else ), рддреЛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рджреЛ рдмрд╛рд░ рд╕рдлреЗрдж рдмреЙрдХреНрд╕ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╕рднреА рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕реЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдЪрдХреНрд░рд╡рд╛рддреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред


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


 if (object.field1 == "123") A else B 

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рджреЛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 val testCase1 = TestCase("A", field1.set("123")(baseline), /* result of A */) val testCase2 = TestCase("B", field1.set(/*  "123", , , */"123" + "1">)(baseline), /*result of B*/) 

(рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ рдкрд░рд┐рдХреНрд╖рдг рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореГрдд рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рд╢рд╛рдЦрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)


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


рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдПрд▓

рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рддрдВрддреНрд░ рдЙрди рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдкреВрд░реНрдг рдХрд╡рд░реЗрдЬ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЬрдорд╛ рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╛ рддреЛ рдбреАрдПрд╕рдПрд▓ рд╕реЗ рдКрдкрд░ рдореЙрдбрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рд╕реВрдЪреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрд╛ рдЖрдк рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЛ T => T рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 val change1: T => T = field1.set("123")(_) // val change1: T => T = _.copy(field1 = "123") val change2: T => T = field2.set("456") 

рддрдм рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реЛрдЧреА:


 val changes = change1 compose change2 

рдпрд╛, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП:


 val rawChangesList: Seq[T => T] = Seq(change1, change2) val allChanges: T => T = rawChangesList.foldLeft(identity)(_ compose _) 

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


 val tests: Seq[(String, T => T)] = IF("field1 == '123'") //  ,    THEN( field1.set("123"))( //  target \ field1 := "123" IF("field2 == '456') THEN(field2.set("456"))(TERMINATE) ELSE(field2.set("456" + "1"))(TERMINATE) ) ELSE( field1.set("123" + "1") )(TERMINATE) 

рдпрд╣рд╛рдВ tests рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдордЧреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВред String рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЙрди рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдЙрди рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирд╕реЗ рдХреБрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдп рдмрдирддрд╛ рд╣реИред рдФрд░ T => T рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХрддреНрд░рд┐рдд рдХрд╛рд░реНрдп рд╣реИред


рдмрджрд▓реА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╡рд╕реНрддреБ рдореЗрдВ рд╕рднреА рдПрдХрддреНрд░рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 val tests2: Seq[(String, T)] = tests.map(_.map_2(_(baseline))) 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЬреЛрдбрд╝реЗ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЗрди рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧреА, рдФрд░ рдЬреЛрдбрд╝реА рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╡рд╣ рд╡рд╕реНрддреБ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдпреБрдХреНрдд рд╣реИрдВред


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


рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА


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


рдПрдХрд▓ рд╢рд╛рдЦрд╛ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 if(object.field1 == "123") A else B 

рдпрд╣ рд╕реНрдерд┐рддрд┐ field1 рдорд╛рди рдХреЗ рд╕реЗрдЯ рдХреЛ рджреЛ рд╕рдорддреБрд▓реНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИ: == "123" рдФрд░ != "123" ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рднреА рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджреЛ рд╕рдордХрдХреНрд╖ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - ClassCondition1IsTrue рдФрд░ ClassCondition1IsFalse ред рдХрд╡рд░реЗрдЬ рдХреА рдкреВрд░реНрдгрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, A рдФрд░ B рджреЛрдиреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рджреЛ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ B рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдПрдХ рдЕрдиреЛрдЦреЗ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд╕реНрддреБ рд▓реЗрдВ, рд▓реЗрдХрд┐рди field1 рдХреЛ "123" рдмрджрд▓ рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорддреБрд▓реНрдпрддрд╛ рд╡рд░реНрдЧ ClassCondition1IsTrue рдореЗрдВ ClassCondition1IsTrue рдФрд░ рдЧрдгрдирд╛ рд╢рд╛рдЦрд╛ A рд╕рд╛рде рдЬрд╛рдПрдЧреА A рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЗрдирдкреБрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдФрд░ field1 == "123" рд╕рд╛рде рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдПрдХ рдФрд░ рддрд░реАрдХрд╛: рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд╕реНрддреБ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди field1 рдХреЛ "123" + "*" рдореЗрдВ рдмрджрд▓реЗрдВ (рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рд░реЗрдЦрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирдИ рд▓рд╛рдЗрди рдирд┐рдпрдВрддреНрд░рдг рд░реЗрдЦрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ)ред


ScalaCheck рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ Arbitrary рдФрд░ Gen рд░реИрдВрдбрдо рдбреЗрдЯрд╛ Arbitrary рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред


рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ, рд╣рдо if рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреВрд▓рд┐рдпрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ ред рдпрд╣реА рд╣реИ, рд╣рдо рдЗрдирдкреБрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдорд╛рди рдкрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреВрд▓рд┐рдпрди рдлрд╝рдВрдХреНрд╢рди true рдорд╛рди рд▓реЗрддрд╛ true - ClassCondition1IsTrue , рдФрд░ рдЗрдирдкреБрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдорд╛рди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╛рди false - ClassCondition1IsFalse ред


рдЗрд╕реА рддрд░рд╣, рд╕рд╛рдзрд╛рд░рдг рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдПрдХ рдирд┐рд░рдВрддрд░ рд╕реЗ рдХрдо / рдПрдХ рд╕реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдПрдХ рдирд┐рд░рдВрддрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЙрд▓рдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рднрд▓реЗ рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЙрдирдХреА рдХреЙрд▓ рдХреЛ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ (рдЗрдирд▓рд╛рдЗрди) рдФрд░ рдлрд┐рд░ рднреА рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рдХрдард┐рди рдкреНрд░рддрд┐рд╡рд░реНрддреА рдХрд╛рд░реНрдп


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


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


 if(sha(object.field1)=="a9403...") ... //     ==> if(object.sha_field1 == "a9403...") ... 

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


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


рдЖрд╢реНрд░рд┐рдд рд╕реНрдерд┐рддрд┐


, . , , , . , . (, , x > 0 , тАФ x <= 1 . , тАФ (-тИЮ, 0] , (0, 1] , (1, +тИЮ) , тАФ .)


, , , true false . , , " " .



, , :


 if(x > 0) if(y > 0) if (y > x) 

( > 0 , тАФ y > x .)
"", , , , , . , " " .
, "", ( y == x + 1 ), , .
"" ( y > x + 1 && y < x + 2 ), , .



, , - , "c " ( Symbolic Execution , ), . ( field1 = field1_initial_value ). , . :


 val a = field1 + 10 //    a = field_initial_value + 10 val b = a * 3 //    b = 3 * field_initial_value + 30 

тАФ true false . . . рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП


 if(a > 0) A else B //   A ,  field_initial_value + 10 > 0 //   B ,  field_initial_value + 10 <= 0 

, , , , . , (, , ).



. , , . , . , .


, . . , , . , , , . , , , , , ?


Y- ( " " , stackoverflow:What is a Y-combinator? (2- ) , habr: Y- 7 ). , . ( , , .) . , . , "" . Y- " " ( ).


( ). , . , . , . , , , TestCase '. , , ( throw Nothing bottom , ). .


, . . , , . , . , , . , , , , . , . , .



, , , , 100% . , , . рд╣рдореНрдоред . , , , ? , , - .


:


  1. .
  2. ( ).
  3. , .
  4. , .

, , . -, , , , . -, , , ( , ), , , "" . / , .


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


" " " ". , , , , . , .


, , , , . -, , ( ), . -, -, . DSL, , . -, , . -, , ( , , ). .


, , . , , - .


рдзрдиреНрдпрд╡рд╛рдж


@mneychev .

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


All Articles