16 สิงหาคม 2562

[Q&A] Parameter และ Argument ต่างกันอย่างไร?

เมื่อศึกษาการเขียนโปรแกรมไปเรื่อย ๆ จะพบกับคำศัพท์ว่าพารามิเตอร์ (Parameter) และอาร์กิวเมนต์ (Argument) หลายคนสงสัยและสับสนว่าสองคำนี้ต่างกันอย่างไร ผู้เขียนจะมาอธิบายในบทความนี้ แต่ก่อนหน้านั้นท่านต้องเข้าใจแนวคิดเรื่องโปรแกรมย่อย (Subprogram)


โปรแกรมย่อย

โปรแกรมย่อยคือชุดของคำสั่งที่แยกออกมาจากส่วนหลักของโปรแกรม (เช่น ส่วนหลักในภาษา C, Java คือฟังก์ชัน main) จุดประสงค์ของการแยกชุดของคำสั่งคือเพื่อเป็นอิสระจากส่วนหลัก ทำให้สามารถแก้ไขง่าย และเรียกใช้งานซ้ำได้หลายครั้ง โดยปกติโปรแกรมหลักจะถูกทำงานเป็นลำดับแรก ส่วนโปรแกรมย่อยจะไม่ถูกทำงานเลย ยกเว้นแต่จะถูกเรียกใช้งานจากโปรแกรมหลักหรือโปรแกรมย่อยอื่นที่กำลังทำงาน โปรแกรมเมอร์มักใช้โปรแกรมย่อยเพื่อสั่งให้ทำงานบางอย่างที่เจาะจง หลายครั้งมีการส่งข้อมูลไปยังโปรแกรมย่อย และรับข้อมูลที่ได้จากโปรแกรมย่อยกลับคืนสู่โปรแกรมที่เรียกใช้

โปรแกรมย่อยแบ่งออกเป็น 2 แบบได้แก่ โปรแกรมย่อยที่ส่งค่าคืน (Return) จากโปรแกรมย่อยนั้นกลับมายังโปรแกรมที่เรียกใช้ มักถูกเรียกว่าฟังก์ชัน (Function) และโปรแกรมย่อยที่ไม่ส่งค่าคืนกลับมา มีหลายชื่อแล้วแต่ภาษา เช่น Procedure, Sub (ในภาษา C, Java จะมองโปรแกรมย่อยที่ไม่ส่งค่ากลับเป็นฟังก์ชันแบบ void) แต่ค่าในอธิบายที่กล่าวมานี้ยังไม่ใช่พารามิเตอร์และอาร์กิวเมนต์ เนื่องจากค่าที่กล่าวมาเป็นค่าที่ส่งหลังจากโปรแกรมย่อยทำงานเสร็จแล้ว


พารามิเตอร์ V.S. อาร์กิวเมนต์

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


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

อย่าเรียกพารามิเตอร์และอาร์กิวเมนต์สลับกัน เพราะสองคำนี้ถูกเรียกจากมุมมองที่ต่างกัน โปรแกรมย่อยเป็นอิสระจากโปรแกรมที่เรียกใช้ โปรแกรมย่อยจะเป็นผู้กำหนดว่าค่าใดตัวแปรชนิดใดควรนำเข้ามา โปรแกรมที่เรียกใช้ต้องส่งอาร์กิวเมนต์ให้ถูกต้องตามที่โปรแกรมย่อยกำหนดเท่านั้น นอกจากนี้ยังมีคุณสมบัติหลายอย่าง เช่น การตั้งชื่อโปรแกรมย่อยซ้ำกันแต่มีพารามิเตอร์ต่างกัน (Overloading) หรือการตั้งค่าเริ่มต้น (Default) สำหรับพารามิเตอร์ที่ไม่ได้รับอาร์กิวเมนต์, รวมทั้งค่าของพารามิเตอร์และค่าของอาร์กิวเมนต์ถูกเก็บแยกกันเป็นตัวแปรคนละตัว เพียงแค่เป็นตัวแปรคนละตัวที่มีค่าเหมือนกัน (ยกเว้นว่าเป็นพารามิเตอร์แบบ Reference จากอาร์กิวเมนต์)
จำง่าย ๆ ว่า “ส่งออกอาร์กิวเมนต์ นำเข้าพารามิเตอร์”

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

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