2007/Apr/09

Go To Nornote.com hear http://www.nornote.com

2006/May/28

Strategy Pattern

คำอธิบาย: เป็นการทำให้โปรแกรมที่เขียนขึ้นนั้นสามารถปรับเปลี่ยนแก้ไขพฤติกรรม (Behavior) ได้อย่างมีอิสระ โดยเฉพาะอย่างยิ่งในช่วงเวลาขณะที่โปรแกรมทำงานแล้ว (Run time)


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


แม่นไหมหละครับ อันที่จริงแล้วคลาสที่คุณออกแบบมานั้นไม่ผิดหรอกครับ แต่เผอิญว่าในเกมนั้นสุนัขดันเจ็บคออย่างหนัก เนื่องมาจากดันไปกินกระดูกควายเข้าให้ คราวนี้มันเห่าไม่ได้แล้วหละสิ อ้าวแล้วเราจะทำอย่างไรดีหละ เอ๊ะไม่ใช่แค่นั้นพอสุนัขแต่ละตัวเริ่มโตขึ้นมันก็มีเสียงเห่าที่เปลี่ยนไปคุณคงไม่ให้สุนัขที่รูปร่างใหญ่และดูน่าเกรงขามเห่าเสียงดัง "บ๊อก บ๊อก...." ตลอดไปหลอกนะครับอ้าวคราวนี้เรื่องใหญ่เลยแล้วเราจะไปเปลี่ยนเสียงเห่ามันยังไงดีหละ เอาหละครับถ้าคุณเจอสถานะการแบบนี้ให้รีบนึกถึง Strategy Pattern เลยครับเขาช่วยเราได้แน่ๆ โดยขั้นตอนการทำนั้นก็แสนจะง่ายครับมีหลักการดังนี้

1. Encapsulate group of behavior. ทำการรวมกลุ่มของพฤติกรรมออกเป็นกลุ่มๆ
2. Use Has-a to make them interchangeable. ใช้การมีคุณสมบัติของ Object แทนการสืบทอด


ฟังดูแล้วน่าสงสัยใช่ไหมครับว่าทำอย่างไร เราลองดู Class Diagram กันหน่อยว่าจะออกมาหน้าตาอย่างไร



นี่คือส่วนของโค้ด

// ส่วนของ performBark() ใน abstract class Dog
public void performBark(){
barkBehavior.bark();
}

..
// ส่วนของ main()

BarkBehavior bark = new Bark();
BarkBehavior hong = new Hong();


Dog doberman = new Doberman();

doberman.setBarkBehavior(bark);

// ทดสอบการส่งเสียง เสียงที่ออกมาจะเป็น barkbark...
doberman.performBark();
..



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

..
// ทำการเปลี่ยนคุณสมบัติของเสียง
doberman.setBarkBehavior(hong);

// ทดสอบการส่งเสียง เสียงที่ออกมาจะเป็น hong hong...
doberman.performBark();
..


เป็นไงหละครับง่ายหรือเปล่า Strategy Pattern ง่ายนิดเดียว

nornote
nornote@hotmail.com

2006/May/28

Designs Patterns

Design Patterns คือการนำหลักการเขียนโปรแกรมที่มีแบบแผนมาประยุกต์ใช้ในการแก้ปัญหาสถานะในการเขียนโปรแกรมในชีวิตจริงที่เรากำลังเผชิญอยู่

ในการเขียนโปรแกรมตามหลักของ OOP (Object Orianted Programming) เราจะมีการนำความรู้พื้นฐานซึ่งได้แก่ Abstraction, Encapsulation, Polymorphism, Inheritance มาประยุกต์เพื่อเขียนออกมาเป็นโปรแกรม ถึงแม้ว่าโปรแกรมนั้นจะทำงานได้อย่างสมบูรณ์ แต่เมื่อถึงเวลาหนึ่งเราจำเป็นที่จะต้องปรับปรุงแก้ไขโปรแกรมเหล่านั้น เช่น เพิ่มรูปแบบการทำงาน, เปลี่ยนรูปร่างหน้าตาการแสดงผล หรือแม้แต่เพียงแค่ทำการตัดฟังก์ชั่นการทำงานใดฟังก์ชั่นหนึ่งเท่านั้นเป็นไปได้ยาก ซึ่งสาเหตุหนึ่งมาจากเขียนโปรแกรมที่ไม่มีระเบียบแบบแผนที่ดี ดังนั้นจึงได้มีกลุ่มคนกลุ่มหนึ่งรู้จักกันในนาม the Gang of Four ซึ่งเป็นผู้ที่มีความเชี่ยวชาญด้านการออกแบบระบบได้ทำการสร้างรูปแบบการเขียนโปรแกมออกเป็นหลายแบบซึ่งแต่ระแบบนั้นสามารถนำมาประยุกต์ใช้ได้จริง และจะช่วยให้โปรแกรมที่พัฒนาขึ้นนั้นมีระเบียบแบบแผน สามารถที่จะปรับปรุงแก้ไขเพิ่มเติมในภายหลังได้อย่างง่ายดาย

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

nornote
nornote@hotmail.com