บทที่ 2 ปัญหาการเขียนโปรแกรมโดยใช้โปรแกรมย่อย

ปัญหาการเขียนโปรแกรมโดยใช้โปรแกรมย่อย
ในการเขียนโปรแกรมคอมพิวเตอร์จะประกอบด้วยคำสั่ง (Statement) หลายๆ คำสั่งมาต่อเรียงกัน ถ้าหากต้องการรวมหลายๆ คำสั่งให้เป็นคำสั่งใหม่สามารถทำได้โดยการสร้างเมธอด (Method) เมื่อมีการเรียกเมธอดที่สร้างขึ้นมาทำงาน คำสั่งต่างๆ ที่รวมอยู่ในเมธอดนั้นจะถูกเรียกใช้งานอัตโนมัติ การสร้างเมธอดขึ้นมาใช้งานนี้สามารถช่วยลดการเขียนโค้ดโปรแกรมที่ซ้ำซ้อนได้ ทำให้สะดวกในการแก้ไขโปรแกรมในภายหลัง
ในการออกแบบโปรแกรมผู้เขียนโปรแกรมมักจะแบ่งปัญหาออกเป็นส่วนๆ แล้วให้โปรแกรมหลักเรียกส่วนๆ ของโปรแกรมนั้นขึ้นมาทำงาน ส่วนของโปรแกรมเหล่านี้ก็คือเมธอดนั่นเอง แต่ภาษาบางภาษาอาจะเรียกว่าโปรแกรมย่อย หรือซับรูทีน (Subroutine) บางภาษาเรียกว่า โปรแกรมย่อย (Procedure) หรือฟังก์ชั่น (Function) เป็นต้น
สำหรับในบทนี้จะขอเน้นการศึกษาเกี่ยวกับปัญหาของการเขียนโปรแกรมโดยใช้เมธอดในกรณีต่างๆ เพื่อให้นักศึกษาได้เห็นภาพของปัญหาของการเขียนโปรแกรมเชิงโครงสร้างซึ่งนักศึกษาจะได้นำไปต่อยอดในการเขียนโปรแกรมเชิงวัตถุ เนื่องจากการเขียนโปรแกรมเชิงวัตถุนั้นพื้นฐานที่สุดก็คือเรื่อง “วัตถุ” โดยที่ส่วนประกอบของวัตถุจะประกอบไปด้วย พฤติกรรม(เมธอด) และคุณสมบัติของวัตถุ (พร็อพเพอร์ตี้) ดังนั้นนักศึกษาควรต้องมีความอดทน ค่อยๆ ทำความเข้าใจศึกษาเรื่องของเมธอดไปทีละส่วนเพื่อความเข้าไปในการเขียนโปรแกรมเชิงวัตถุต่อไป
แนวคิดเกี่ยวกับเรื่องของเมธอดหรือฟังก์ชั่นในที่นี้นั้นเราจะสนใจประเด็นอยู่ 3 ประเด็น คือ
1. ค่าที่เราต้องส่งเข้าไปในฟังก์ชั่น (อาร์กิวเมนต์ )
2. ค่าที่ฟังก์ชั่นต้องส่งกลับออกมาให้เรา (
Return)
3. และหากเป็นฟังก์ชั่นของระบบซึ่งในกระบวนการทำงานในฟังก์ชั่นจะทำงานเช่นไรก็ไม่จำเป็นที่จะต้องทราบ (
Process)

หากจะเปรียบเทียบกับกระบวนการทำงานของคอมพิวเตอร์แล้ว การที่จะส่งค่าเข้าไปเพื่อประมวลผลนั้นก็คือการ Input ค่าเข้าไป และการที่เมธอดได้ส่งค่ากลับนั้นหมายถึงการ Output  ส่วนกระบวนการภายในเมธอดเพื่อให้ได้ Output ออกมานั้นจะเรียกการ Process  ดังภาพ
สำหรับหลักในการตั้งชื่อเมธอดนั้น เนื่องจากเมธอดคือ พฤติกรรมที่บ่งบอกการทำงานของวัตถุ ดังนั้นหากต้องการตั้งชื่อของเมธอดให้เป็นไปตามแนวคิดการเขียนโปรแกรมเชิงวัตถุส่วนมากแล้วจะตั้งชื่อให้แสดงถึงพฤติกรรมซึ่งจะใช้คำกริยาบอกอาการของวัตถุ เช่น doGrade() getData() SaveData()

ประเภทของเมธอดหรือโปรแกรมย่อย.
สำหรับเมธอดในภาษา Vb.NET เราสามารถแบ่งได้ตามพฤติกรรมการส่งค่ากลับได้ 2 ประเภท คือ  โปรแกรมย่อยชนิดไม่คือค่ากลับ  (Sub Routine) และ โปรแกรมย่อยชนิดคือค่ากลับ (Function)  
1. การใช้งานโปรแกรมย่อยชนิด Sub Routine เป็นโปรแกรมย่อยที่เมื่อจบการทำงานแล้ว จะไม่มีการส่งผล การทำงานกลับมาให้ทราบ จึงมักเขียน Sub Routine ที่ต้องการเฉพาะผลของงาน แต่ไม่ต้องการเน้นผลลัพธ์การทำงานกลับมาให้ ซึ่งในบางครั้งอาจจะเรียกว่า Procedure
รูปแบบการประกาศเมธอด
|1|        Sub    ชื่อของเมธอด ([รายการพารามิเตอร์])
|2|                          
|3|                 ...ประโยคคำสั่ง....
|4|                 
|5|        End Sub
ตัวอย่างที่ 1 เป็นการเขียนชุดคำสั่งของโปรแกรมย่อยชนิดไม่คืนค่ากลับ โดยการทำงานของตัวอย่างนี้เพื่อให้กลุ่มของ Textbox มีสถานะทำงานหรือไม่ทำงานในตัวอย่างนี้จะเห็นว่าจะต้องสร้างโปรแกรมย่อยชนิดไม่คืนค่า (Sub routine) โดยไม่มีการส่งผ่านค่าของตัวแปรพารามิเตอร์ ซึ่งกรณีดังกล่าวจะต้องเขียนโปรแกรมออกเป็น 2 เมธอด คือ
การเขียนโค้ดคำสั่งเมธอดแบบไม่ส่งค่ากลับ

|1|         Sub enableObjectTrue()
|2|             txtScore1.Enabled = True
|3|             txtScore2.Enabled = True
|4|             txtScore3.Enabled = True
|5|             txtScore4.Enabled = True
|6|             txtScore5.Enabled = True
|7|             txtScore6.Enabled = True
|8|             txtScore7.Enabled = True
|9|             txtScore8.Enabled = True
|10|            txtScore9.Enabled = True
|11|            txtScore10.Enabled = True
|12|        End Sub
|13|        '--------------------------------------
|14|        Sub enableObjectFalse()
|15|            txtScore1.Enabled = False
|16|            txtScore2.Enabled = False
|17|            txtScore3.Enabled = False
|18|            txtScore4.Enabled = False
|19|            txtScore5.Enabled = False
|20|            txtScore6.Enabled = False
|21|            txtScore7.Enabled = False
|22|            txtScore8.Enabled = False
|23|            txtScore9.Enabled = False
|24|            txtScore10.Enabled = False
|25|        End Sub

จาก 2 เมธอดในโค้ดด้านบน โปรดสังเกตหน้าที่ของเมธอดจะมีหน้าที่คล้ายกันคือ การกำหนดค่าสำหรับคุณสมบัติ Enable เพื่อสั่งให้ Textbox  มีสถานะทำงานในเมธอด enableObjectTrue และสถานะที่ไม่ทำงานในเมธอด enableObjectFalse ด้วยหน้าที่ทั้งสองเมธอดนี้มีความซ้ำซ้อนกัน ดังนั้นนักศึกษาสามารถปรับปรุงการเขียนโค้ดใหม่ให้เหลือเพียงเมธอดเดียว คือเมธอด enableObject โดยให้รับค่าผ่านตัวแปรพารามิเตอร์ที่มีชื่อว่า prmVal  ซึ่งตัวแปรนี้จะรับค่าคือ True หรือ False  ดังโค้ดด้านล่าง

การปรับปรุงเมธอดเพื่อให้รับค่าผ่านตัวแปรพารามิเตอร์

|1|         Sub enableObject(prmVal As Boolean)
|2|             txtScore1.Enabled = prmVal
|3|             txtScore2.Enabled = prmVal
|4|             txtScore3.Enabled = prmVal
|5|             txtScore4.Enabled = prmVal
|6|             txtScore5.Enabled = prmVal
|7|             txtScore6.Enabled = prmVal
|8|             txtScore7.Enabled = prmVal
|9|             txtScore8.Enabled = prmVal
|10|            txtScore9.Enabled = prmVal
|11|            txtScore10.Enabled = prmVal
|12|        End Sub

การเรียกใช้เมธอดนี้สามารถเรียกใช้ผ่านเหตการณ์ต่างๆ จากฟอร์มซึ่งในตัวอย่างต่อไปนี้จะเป็นการเรียกเมธอด ผ่านเหตุการณ์เมื่อมีการโหลดของฟอร์ม โดยจะส่งค่าอาร์กิวเมนต์เข้าไปคือค่า  False

การเรียกใช้เมธอดและการส่งค่าอาร์กิวเมนต์

|1|         Private Sub Form1_Load() Handles MyBase.Load
|2|    
|3|             enableObject(False)
|4|    
|5|         End Sub

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

บทที่ 11 ตอน 3 การออกแบบรายงานด้วย Crystal Report

บทที่ 6 กระบวนการพอลิมอร์ฟิซึม (Polymorphism)

บทที่ 11 ตอน 3 การออกแบบรายงานด้วย Crystal Report Ex2