Design Patterns EP.0 [มันคืออะไร?]

จริงๆแล้ว Design Patterns ถ้าหากจะให้แปลแบบตรงๆตัวตามความหมายภาษาเลยก็น่าจะแปลว่า “การออกแบบรูปแบบ” ? แล้วมันคืออะไรล่ะ ยิ่งอ่านยิ่งงง

source : wrightslaw

การออกแบบรูปแบบคือการวางแผนการเขียนโปรแกรมก่อนที่จะเริ่มสร้างโปรแกรมขึ้นมาจริงๆ หรือจะให้บอกง่ายๆมันก็คือแนวทางการเขียนโปรแกรมนั่นแหละครับ

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

source : youtube

Design pattern คือการออกแบบรูปแบบของโปรแกรมเพื่อใช้ในการลดปัญหาดังที่กล่าวมาข้างต้นและยังทำให้เราสามารถสร้างโปรแกรมได้เร็วขึ้นอีกด้วย ซึ่ง Design pattern แบ่งออกเป็นกลุ่มใหญ่ๆได้ 3 รูปแบบ ซึ่งประกอบไปด้วย

1. Creational design patterns

Creational design patterns คือการออกแบบรูปแบบ ที่เกี่ยวข้องกับเรื่องของ การสร้าง Object และ แนวทางแก้ปัญหาเรื่อง Object เอ๊ะ ??? ยังไง?? งงในงง ???

ไม่ต้องตกใจครับ ในรายละเอียด Creational design patterns แบ่งย่อยไปอีก คือ

  1. Abstract Factory

สำหรับ Abstract Factory ก็คือแนวคิดที่ว่า Client ไม่จำเป็นต้องติดต่อกับ concrete Factory เพื่อสร้าง Object แต่ให้ติดต่อผ่าน abstract Factory แทน ซึ่งจะช่วยลด Dependency ระหว่าง Client และ Concrete Factory และจะส่งผลเราสามารถเพิ่มหรือเปลี่ยนแปลง Factory ได้ในภายหลัง โดยที่ไม่กระทบกับการทำงานของ client

ห๊ะ ???? คือไร ???? อาจจะยังงงๆอยู่ใข่มั้ย ให้ลองดูตัวอย่างนี้

source : Kapook

สมมุติว่าสมชายต้องการกินข้าวมันไก่ ไปซื้อข้าวมันไก่ที่ร้านใกล้บ้าน โดยที่สมชายสนใจแต่เรื่องจ่ายเงินไม่สนใจว่าข้าวมันไก่มันมาจากไหน ร้านใกล้บ้านนั้นอาจจะไปซื้อจาก Safari World หรือ ซื้อจากฟาม CP ก็ได้

ในที่นี้สมชาย ก็คือผู้ใช้บริการหรือ Client ร้านค้าใกล้บ้าน คือผู้ให้บริการหรือ Abstract Factory และ Safari worldหรือCP ก็คือ Concrete Factory

ในการใช้งานนั้น Client จะมีการติดต่อกับกับ Abstract Factory แต่จะไม่ได้ติดต่อกับ Concrete Factory โดยตรง เพราะจะทำให้เราสามารถเพิ่มหรือเปลี่ยนแปลง Concrete Factory ในภายหลังได้นั่นเองครับ (อยากเปลี่ยนไปซื้อไก่ที่ตลาดสด ได้ข่าวว่าราคาถูกคนแห่ไปซื้อเยอะดี เป็นต้นครับ)


2. Builder

สำหรับ Builder ถ้าจะให้มองแบบง่ายสุดๆมันคือการทำอาหารครับ ห๊ะ ????

source : pantip

การที่เราเดินไปร้านอาหารตามสั่งนั้น จริงๆแล้วเรากำลังใช้วิธี Builder patterns อยู่ ยกตัวอย่าง เช่นการสั่งข้าวไข่เจียว บางคนอาจจะอยากใส่หมูสับ บางคนอาจจะอยากใส่พริก หรืออาจจะเครื่องปรุงที่แตกต่างกัน สิ่งเหล่านีี้คือการที่เราสามารถเลือกเองได้

จากตัวอย่างข้างต้นนั้น การใช้ Builder Pattern นั้น จะช่วยให้เราสามารถกำหนดการสร้าง object ถ้าเปรียบเทียบกับไข่เจียวก็คือการเลือกสิ่งที่ต้องการจะปรุงแต่งลงไปในไข่เจียวเรานั่นแหละครับ

เริ่มต้นจากเรา (Client) จดรายการอาหารลงไปในกระดาษ (Director) แล้วเอาส่งให้แม่ครัว (Builder) แล้ว แม่ครัวก็จัดการทำอาหารออกมาให้เรา ซึ่งถ้าเราใช้ Builder pattern นี้เราจะสามารถระบุหรือจัดการรายการอาหารได้ว่าใส่อะไรไม่ใส่อะไรได้ ทำให้ object ที่ออกมา มีลักษณะที่แตกต่างกันครับ


3. Factory Method
Factory Method ถ้าให้แปลแบบคนได้ภาษาอังกฤษเกรดD นั้นแปลว่า โรงงานผลิต method ครับ โดยที่ Factory Method จะมอง class กลุ่มหนึ่งเป็นโรงงานผลิตภัณฑ์ที่ผลิตสินค้าได้ประเภทเดียว เช่นถ้าผลิตไส้กรอก ก็ต้องผลิตไส้กรอกอย่างเดียว จะผลิตอย่างอื่นด้วยไม่ได้เดี๋ยวผิด Concept 555555

source : metamute

การใช้ Factory Pattern ในการสร้าง Object จะช่วยให้เราสามารถ Encapsulate ความซับซ้อนของการสร้าง Object และยังเป็นการ abstract ในส่วนของการสร้าง Object โดยเราสามารถสร้าง Object ที่แตกต่างกันจาก Factory Method เดียวกัน


4. Object Pool
สำหรับ Object pool นั้น ลองนึกภาพถึงห้องสมุดครับ สังเกตุมั้ยว่า จำนวนคนที่ไปยืมหนังสือกับจำนวนหนังสือนั้นไม่เท่ากัน แต่จะมีช่วงๆนึงเช่นช่วงจะสอบไฟนอล คนกลุ่มๆนึงต้องการใช้หนังสือเล่มเดียวกัน ทำให้ห้องสมุดนั้นต้องมีหนังสือจำนวนเพียงพอต่อการใช้งาน แล้วพอใช้งานเสร็จ ก็นำหนังสือมาคืน แค่นี้ก็คือการใช้งาน Object pool pattern ครับ

เหมาะสำหรับระบบที่มีการสร้าง Object ชนิดเดียวกันจำนวนมากๆ เพราะจะสามารถ Utilize การใช้ object pool ได้อย่างเต็มที่ครับ

source : banidea

5. Prototype pattern
Prototype pattern มีประโยชน์ทางด้านการใช้ Object ที่มีจำนวนมาก ๆ โดยที่ว่าเราไม่ต้องไป New Object กันอีกต่อไปเรื่อย ๆ ซึ่งทำให้เปลืองทรัพยากรด้วย แต่เราก็จะต้องมีตัวต้นแบบ และก็ Clone มาเรื่อย ๆครับ

source : ibtimes

6. Singleton
Singleton pattern เป็น design pattern ที่ใช้จำกัดจำนวน object ที่ถูกสร้างในขณะที่โปรแกรมทำงาน มีประโยชน์ในสถานการณ์ที่ทั้งระบบต้องมี object เพียงตัวเดียวเพื่อจะได้ไม่เกิดการทำงานซ้ำซ้อนกันเช่น class สำหรับ setting ค่าต่าง ๆ ครับ

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

source : ebookers

และสำหรับ pattern อีก 2 pattern ใหญ่จะมาเล่าต่อใน EP ต่อไปครับโดยจะประกอบไปด้วย

  1. Structural design patterns
  2. Behavioral design patterns

สรุป

ไม่แน่ใจว่าจะสามารถสื่อออกมาให้คนเข้าใจได้มากน้อยแค่ไหน แต่ยังไงซะ ก็อยากจะบอกว่า Design patterns นั้น ล้วนแต่อยู่ชีวิตประจำวันเราทั้งนั้นเลยครับ

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

จบสักที น้ำตาจะไหลครับ ขอบคุณที่อ่านจนจบครับ ~!@#$%^&*()_+

source : askmen