FluentInterface

สมมติว่าผมมี code ตัดมาจากเหตุการณ์หนึ่ง โดย เรียกใช้ Domain API ชุดหนึ่ง เขียน code ได้ดังนี้

[C#]

var newOrder = new Order(customer);

var orderLine1 = new OrderLine(productRepository.GetProduct(“XBOX-ONE”));
orderLine1.Quantity = 15;
newOrder.AddOrderLine(orderLine1);

var orderLine2 = new OrderLine(productRepository.GetProduct(“PS4”));
orderLine2.Quantity = 10;
newOrder.AddOrderLine(orderLine2);

[Ruby]

new_order = Order.new(customer)
order_line1 = OrderLine.new(product_repository.get_product(‘XBOX-ONE’))
order_line1.quantity = 15
new_order.add_order_line(order_line1)

order_line2 = OrderLine.new(product_repository.get_product(‘PS4’))
order_line2.quantity = 10
new_order.add_order_line(order_line2)

จะเห็นว่า เราเขียนหลายบรรทัด อ่าน code นี้แล้ว ก็รู้สึกเฉยๆ เพราะเราก็อ่านแบบนี้มานานแล้วสินะ งั้นเราลองเขียนลดบรรทัดให้น้อยลงดูมะ ผมก็เลยกลับไป Refactoring Domain API นี้ใหม่ แล้วเขียน code ออกมาได้แบบนี้

[C#]

var newOrder = new Order(customer);
newOrder.AddOrderLine(new OrderLine(15, productRepository.GetProduct(“XBOX-ONE”)));
newOrder.AddOrderLine(new OrderLine(10, productRepository.GetProduct(“PS4”)));

[Ruby]

new_order = Order.new(customer)
new_order.add_order_line(15, OrderLine.new(product_repository.get_product(‘XBOX-ONE’))
new_order.add_order_line(10, OrderLine.new(product_repository.get_product(‘PS4’))

ดูดีขึ้นละ code หายไปหลายบรรทัดเลยแฮะ แต่ก็รู้สึกอ่านก็ไม่แตกต่างจากเดิมเท่าไร แค่ลดบรรทัด งั้นลองทำตาม  FluentInterface [Fowler] ดูดีกว่า กลับไป Refactoring Domain API อีกครั้งโดยใช้ FluentInterface ที่อาจารณ์ Fowler แนะนำมาดูซิ เสร็จละ ก็เขียน code ออกมาใหม่ได้แบบนี้

[C#]

var newOrder = new Order(customer).With(15, “XBOX-ONE”).With(10, “PS4”);

[Ruby]

new_order = Order.new(customer).with(15, ‘XBOX-ONE’).with(10, ‘PS4’)

อืม บรรทัดก็สั้นลงอีก แถมอ่าน code ไม่เหมือนเดิมอีกด้วย ก็คือมันทำให้ผมอ่าน code ได้ราบรื่นเหมือน ภาษาที่เราๆใช้เขียนสื่อสารกันเป็นปกติอยู่แล้ว ซึ่งจะไม่ใช่ภาษาที่โปรแกรมเมอร์ใช้เขียน code แบบปกติที่เขียนกันอยู่

สรุปคือผมก็จะได้ Domain API ที่มี interface ที่จัดเตรียมไว้ให้ใช้เขียน code ได้กระชับขึ้น และราบรื่นขึ้น ซึ่งทำให้คนธรรมดาๆอย่างกระผมเองอ่าน code ได้ง่ายขึ้นไปอีกสินะ

ขอบคุณครับ

#:P

Advertisements