Groovy рдкрд░ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдмрдирд╛рдПрдВ

рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЙрдирдХреА рдХрдо рдирд┐рдХрдЯрддрд╛ рд╣реИред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рдж рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ:
//  class Customer { int inn String name String address String phone } //  class Customers { Customer findByInn(inn) void add(Customer customer) } //  class Product { String article String name double price } //  class Products { Product findByArticle(article) void add(Product product) } //  class Order { int num Customer customer List<OrderDetail> details = [] OrderDetail findByPos(pos) void add(OrderDetail detail) } //   class OrderDetail { int pos Product product def count = 1 def getSum() { count * product.price } } //  class Orders { Order findByNum(num) void add(Order order) } 


рдиреМрдХрд░реА рд╡рд┐рд╡рд░рдг рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
 //  - def customers = new Customers() def products = new Products() def orders = new Orders() //   customers.add(new Customer(inn: 1234, name: "", address: "", phone: "+74951002030")) //   products.add(new Product(article: "a100", name: " 1", price: 100.00)) products.add(new Product(article: "a200", name: " 2", price: 200.00)) //   def order = new Order(num: 1, customer: customers.findByInn(1234)) order.add(new OrderDetail(pos: 1, product: products.findByArticle("a100"), count: 1)) order.add(new OrderDetail(pos: 2, product: products.findByArticle("a200"), count: 1)) orders.add(order) 


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

рдЧреНрд░реВрд╡реА рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рд▓рд┐рдЦрдХрд░ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд░реНрдгрди рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
 AddCustomer(inn: 1234, name: "", address: "", phone: "+74951002030") AddProduct(article: "a100", name: " 1", price: 100.00) AddProduct(article: "a200", name: " 2", price: 200.00) AddOrder(num: 1, customer: 1234) { Detail(pos: 1, product: "a100", count: 1) Detail(pos: 2, product: "a200", count: 1) } 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреА рдЙрдЪреНрдЪ рдкрдардиреАрдпрддрд╛ рд╣реИред

рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЧреНрд░реВрд╡реА рдореЗрдВ рдПрдХ рдмрд┐рд▓реНрдбрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЧреНрд░реВрд╡реА рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдмрд┐рд▓реНрдбрд░рд╕реБрдкреЛрд░реНрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрд┐рд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЛрдб рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рдЧреНрд░реВрд╡реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдбрд░ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
 public class MyBuilder extends BuilderSupport { public Customers customers public Products products public Orders orders //     protected void setParent(Object parent, Object child) { } //     protected Object createNode(Object name) { if (name != "call") throw new Exception("Node required parameters") new Node(null, name); } //        protected Object createNode(Object name, Object value) { throw new Exception("Node required parameters") } //     protected Object createNode(Object name, Map attributes) { //     Node parent = getCurrent() def result //    switch (name) { case "AddCustomer": result = addCustomer(attributes) break case "AddProduct": result = addProduct(attributes) break case "AddOrder": result = addOrder(attributes) break case "Detail": if (parent == null || parent.name() != "AddOrder") throw new Exception( "Detail must be specified with only AddOrder") result = addOrderDetail(parent.value(), attributes) break defailt: throw new Exception("Unknown node ${name}") } new Node(null, name, attributes, result); } //          protected Object createNode(Object name, Map attributes, Object value) { throw new Exception("Node ${name} can not support objects") } //   def addCustomer(Map params) { def customer = new Customer(inn: params.inn, name: params.name, address: params.address, phone: params.phone) customers.add(customer) println "Added customer ${customer.inn}: ${customer.name}" customer } //   def addProduct(Map params) { def product = new Product(article: params.article, name: params.name, price: params.price) products.add(product) println "Added product ${product.article}: ${product.name}" product } //   def addOrder(Map params) { def order = new Order(num: 1, customer: customers.findByInn(params.customer)) orders.add(order) println "Added order ${order.num} from customer ${order.customer.name}" order } //    def addOrderDetail(Order order, Map params) { def count = params.count?:1 def detail = new OrderDetail(pos: params.pos, product: products.findByArticle(params.product), count: count) order.add(detail) println "Added into order ${order.num} detail pos ${detail.pos} " + "with product ${detail.product.name}" detail } } 

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

рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдХреЛрдб рд╣реИ:
 //  - def customers = new Customers() def products = new Products() def orders = new Orders() //    def myApi = new MyBuilder(customers: customers, products: products, orders: orders) //   myApi { AddCustomer(inn: 1234, name: "", address: "", phone: "+74951002030") AddProduct(article: "a100", name: " 1", price: 100.00) AddProduct(article: "a200", name: " 2", price: 200.00) AddOrder(num: 1, customer: 1234) { Detail(pos: 1, product: "a100", count: 1) Detail(pos: 2, product: "a200", count: 1) } } //   println "\n*** Result ***" println "Customers:" println customers println "Products:" println products println "Orders:" println orders 

рдкрд░рд┐рдгрд╛рдо:
рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ 1234: рдЧреНрд░рд╛рд╣рдХ
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЙрддреНрдкрд╛рдж a100: рдЙрддреНрдкрд╛рдж 1
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЙрддреНрдкрд╛рдж a200: рдЙрддреНрдкрд╛рдж 2
рдЧреНрд░рд╛рд╣рдХ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЖрджреЗрд╢ 1
рдЙрддреНрдкрд╛рдж 1 рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдЖрджреЗрд╢ 1 рд╡рд┐рд╕реНрддрд╛рд░ рд╕реНрдерд┐рддрд┐ 1 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
рдЙрддреНрдкрд╛рдж рдЖрдЗрдЯрдо 2 рдХреЗ рд╕рд╛рде рдХреНрд░рдо 1 рд╡рд┐рд╡рд░рдг 2 рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

*** рдкрд░рд┐рдгрд╛рдо ***
рдЧреНрд░рд╛рд╣рдХ:
{inn = 1234, рдирд╛рдо = рдЧреНрд░рд╛рд╣рдХ, рдкрддрд╛ = рд░реВрд╕, рдлреЛрди = + 74951002030}
рдЙрддреНрдкрд╛рдж:
{рд▓реЗрдЦ = a100, рдирд╛рдо = рдЖрдЗрдЯрдо рез, рдореВрд▓реНрдп = резрежреж.реж}
{рд▓реЗрдЦ = a200, рдирд╛рдо = рдЙрддреНрдкрд╛рдж реи, рдореВрд▓реНрдп = реирежреж.реж}
рдЖрджреЗрд╢:
{рд╕рдВрдЦреНрдпрд╛ = 1, рдЧреНрд░рд╛рд╣рдХ = рдЧреНрд░рд╛рд╣рдХ,
рд╡рд┐рд╕реНрддрд╛рд░ = {рд╕реНрдерд┐рддрд┐ = 1, рдЙрддреНрдкрд╛рдж = рдЙрддреНрдкрд╛рдж 1, рдЧрд┐рдирддреА = 1, рдпреЛрдЧ = 100.0};
{рд╕реНрдерд┐рддрд┐ = реи, рдЙрддреНрдкрд╛рдж = рдЙрддреНрдкрд╛рдж реи, рдЧрд┐рдирддреА = рез, рдпреЛрдЧ = реирежреж.реж}}

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рдмрдбрд╝рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдм рдореИрдВ рдЕрдкрдиреЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ GETL (Groovy рдкрд░ рдЖрдзрд╛рд░рд┐рдд ETL) рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдпрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рджреЗрд╢реА рд╕реНрд╡рд░реВрдкрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд XML / JSON рдорд╛рд░реНрдХрд░ рдЕрдм рд░рд╣рд╕реНрдпреЛрдВ рдХрд╛ рдЧрдарди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рд░реНрдХрдЕрдк рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЧреНрд░реВрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рд╡рд░рдг рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рд╕реАрдзреЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ EVAL рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдмреНрд▓реЙрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ GUI рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкреВрд░реНрдг рдЧреНрд░рдВрде рдпрд╣рд╛рдБ рд╕реЗ рдХрдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред

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


All Articles