วันจันทร์ที่ 13 มีนาคม พ.ศ. 2560

Design Patterns ทำไมต้องใช้


Design Patterns ทำไมต้องใช้


ปัญหาที่พบเจอบ่อยในการเขียนโปรแกรมคือ เมื่อโปรแกรมมีความซับซ้อนและจำนวนโค้ดที่มากขึ้นทำให้ยากจะดูแล คนในทีมก็ยากจะทำงานร่วมกันได้เพราะแต่ละคนมีรูปแบบการเขียนโค้ดที่ไม่ เหมือนกัน ในกรณีที่โปรแกรมต้องการพัฒนาให้มีฟังก์ชันในการทำงานที่มากกว่าเดิมก็ทำได้ ยาก เพราะตัวโค้ดเองถูกพัฒนาโดยไม่มีรูปแบบ
Design patterns คือรูปแบบการเขียนโปรแกรมที่ถูกพัฒนาขึ้นเพื่อแก้ปัญหาโค้ดที่ดูซับซ้อนให้ ดูได้ง่ายขึ้น ทำให้ผู้พัฒนาและทีมสามารถเข้าใจสิ่งที่โปรแกรมต้องทำได้ง่ายขึ้นและสามารถ เพิ่มฟังก์ชันใหม่ๆเข้าไปในระบบได้ง่ายขึ้น โดยรูปแบบต่างๆถูกคิดค้นมาเพื่อใช้ในงานที่ต่างกัน
Design Patterns นั้นสามารถแบ่งเป็นกลุ่มใหญ่ๆตามรูปแบบการใช้งานได้ทั้งหมด 3 กลุ่มดังนี้
  • creational
  • structural
  • behavioral
Creational เป็นรูปแบบการเขียนที่ทำให้ตัวอ็อบเจกต์สามารถสร้างอ๊อบเจกต์อื่นๆขึ้นมาระหว่างการทำงานได้
Structural เป็นรูปแบบการเขียนที่ทำให้แต่ละอ็อบเจกต์ที่มีอยู่แล้วให้สามารถทำงานร่วมกันได้
Behavioral เป็นรูปแบบการเขียนที่ควบคุมการส่งข้อมูลระหว่างแต่ล่ะอ๊อบเจกต์
ตัวอย่างการใช้งาน ทุกครั้งที่มีการพูดถึง design patterns จำเป็นอย่างยิ่งที่จะต้องมีโค้ดประกอบ ซึ่งหากจะให้ลงลึกในทุกหัวข้ออาจทำให้บทความนี้มีความยาวมากเกินไป จึงขอยกตัวอย่างการทำใช้งาน design patterns ในกลุ่ม cretional ที่มีการใช้งานบ่อย

Creational



จากรูปการเขียนโค้ดในรูปแบบในกลุ่มของ Creational นั้นจะเป็นการทำงานโดยผ่าน Creator โดยหน้าที่หลักๆคือ หลังจากที่มี Request เข้ามาจะทำการเรียกอ็อบเจกต์ที่จำเป็นต้องใช้งานแล้วส่งค่ากลับไปยัง Request จะสังเกตได้ว่าตัว Request นั้นไม่จำเป็นจะต้องรู้เลยว่าอ๊อฟเจกต์ทำงานอย่างไรแค่เรียกสิ่งที่อยากได้ ก็พอ และตัว Creator เองก็ไม่จำเป็นต้องรู้ว่าระบบทำงานอย่างไรแค่เรียกอ๊อบเจกต์ให้ทำงานแล้วส่ง กลับไปให้ Request ก็พอ การทำงานส่วนใหญ่จะอยู่ที่ Abstracted Object โดยเราจะแบ่งงานที่มีความซับซ้อนออกเป็นกลุ่มที่ทำงานในลักษณะเดียวกัน จากนั้นให้ส่วนของ Creator คอยควบคุมการการสร้างอ็อบเจกต์ใหม่ให้ตรงกับความต้องการของ Request ก็พอ
Creational สามารถแยกย่อยได้ออกเป็นอีกหลายรูปแบบ โดยแต่ละรูปแบบจะมีลักษณะการทำงานที่เหมือนกันคือมี Creator คอยสร้างอ็อบเจกต์ขึ้นมา
ตัวอย่าง Design Patterns ที่อยู่ในกลุ่ม Creational
  • Factory Method
  • Prototype
  • Adapter
  • Decorator

Factory Method

Factory Method เป็น Design Patterns หนึ่งที่อยู่ในกลุ่มของ Creational ซึ่งแน่นอนว่าการทำงานตัองอยู่ในรูปแบบมี Creator คอยสร้างอ๊อบเจกต์อื่นขึ้นมาอย่างแน่นอน
ตัวออย่างการใช้งาน Factory Method Design Pattern
ตัวอย่างนี้สมมุติให้เป็นการพัฒนาโปรแกรมสำหรับชำระเงินออนไลน์ โดยจะมีทั้งหมด 2 วิธีคือ
1.ผ่านทางระบบ Paypal
2.ผ่านทางระบบ Credit Card
โดยวิธีการชำระเงิน 2 ระบบนี้มีความแตกต่างกันในการส่งข้อมูลไปยังเซิร์ฟเวอร์ที่ใช้ในการชำระเงิน และรับค่าที่ถูกส่งมาจากเซิร์ฟเวอร์ของระบบชำระเงินมายังระบบซึ่งขั้นตอน ต่างๆของการชำระเงินของทั้ง 2 วิธีนั้นไม่มีทางเหมือนกันอย่างแน่นอน หากไม่มีการใช้ design patterns เข้ามาช่วยรับรองได้ว่าโค้ดจะต้องมีความยุ่งเหยิงมาก เพราะต้องรองรับการทำงานของระบบ 2 วิธีที่ไม่เหมือนกัน นอกจากนี้หากมีระบบใหม่เพิ่มขึ้นมาเช่น มีการเปลี่ยนธนาคารที่ใช้ในการชำระเงิน การแก้ไขจะมีความยุ่งยากมาก
ในกรณีนี้จึงแยกการทำงานของทั้ง 2 ระบบออกเป็น 2 คลาส คือ Paypal , Creditcard โดย Extended มาจากคลาส Payment หากต้องการใช้งานคลาสทั้ง 2 ก็สามารถเรียกใช้งานผ่านทางคลาส PaymentFactory ดังภาพด้านล่าง


ตัวอย่างโค้ด
Payment.php
ไฟล์นี้ใช้สำหรับเป็นแม่แบบให้กับไฟล์ paypal.php , creditcard.php ความสำคัญที่จำเป็นต้องใช้ interface เพื่อให้คลาสทั้ง 2 มีเมธอดที่เหมือนกันเพื่อให้ paymentfactory เรียกใช้ได้ถูกต้อง และเผื่อไว้ในกรณีที่มีระบบการชำระเงินแบบใหม่จะได้ดูตัวอย่างการเขียนจาก interface คลาสและสามารถเข้าใจการทำงานของระบบได้เร็วขึ้น
PayPal.php
CreditCard.php
จะเห็นได้ว่าทั้ง 2 ไฟล์นั้นสามารถอ่านเข้าใจได้ง่ายขึ้น ไม่มีความซับซ้อนเหลือคลาสใดทำอะไรก็จบในคลาสนั้นได้ ถ้าหากต้องการเพิ่มระบบชำระเงินก็สามารถเพิ่มคลาสใหม่เข้ามาในระบบโดยอ้าง อิงจาก Payment คลาสซึ่งเป็น Interface ได้ทันที
PaymentFactory.php
คลาส PaymentFactory คือหัวใจของการทำงานโดยทำหน้าที่เป็น Creator สำหรับสร้างอ็อบเจกต์ใหม่ขึ้นมาและส่งกลับไปยัง Request
ยังมีข้อสงสัยเรื่อง Factory Method แนะนำให้อ่านเพิ่มเติมที่นี่ได้ http://www.oodesign.com/factory-pattern.html

สรุป

จากประสพการณ์ในการพัฒนา เมื่อการ design patterns มาใช้พบว่าสามารถทำให้การทำงานรวดเร็วขึ้น เพราะระหว่างการพัฒนาไม่จำเป็นต้องวางคิดรูปแบบการเขียนโค้ดเอง แต่เลือกใช้จากรูปแบบที่มีคนอื่นคิดไว้แล้ว เมื่อจะให้คนอื่นทำงานต่อจากส่วนที่เราทำไว้ก็แค่บอกว่าเราได้เลือกใช้ design patterns แบบใดเอาไว้ก็สามารถต่องานกันได้โดยไม่จำเป็นต้องอธิบายมาก และตัวเราเองเมื่อกลับมาแก้ไขโค้ดที่ตัวเองได้เขียนไว้ก็สามารถทำได้ง่าย ด้วย
Design Patterns นั้นช่วยให้เราสามารถทำงานได้เร็วขึ้นแต่ไม่ได้ช่วยให้โปรแกรมของเรามี ประสิทธิ์ภาพมากขึ้น ดังนั้นเราควรศึกษารูปแบบเอาไว้ให้มากๆเพราะให้เราได้เลือกใช้ได้ตรงจุด ประสงค์ มีคำกล่าวที่ว่า “หากค้อนเป็นเครื่องมืออย่างเดียวที่เรามีอยู่ จงมองทุกงานให้เป็นตะปู” สิ่งนี้ใช้ไม่ได้กับการใช้งาน design patterns เพราะหากเลือกใช้งานผิดแทนที่จะช่วยให้เราทำงานได้เร็วขึ้นกลับจะทำให้ ทุกอย่างแย่ลง
หนังสือแนะนำสำหรับผู้อยากศึกษาเพิ่มเติม
Learning PHP Design Patterns

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Set MongoDB in the windows path environment

  Let’s set MongoDB in the windows environment in just a few steps. Step 1: First download a suitable MongoDB version according to your mach...