คำถามง่าย ๆ แต่บ่อยครั้งที่ฉันได้ยินคำศัพท์สามคำที่นิยามด้วยความดุร้ายเช่นนี้
คำจำกัดความ "ถูกต้อง" ของ "ขั้นตอน", "วิธีการ", "ฟังก์ชั่น", "รูทีนย่อย" ฯลฯ คืออะไร?
คำถามง่าย ๆ แต่บ่อยครั้งที่ฉันได้ยินคำศัพท์สามคำที่นิยามด้วยความดุร้ายเช่นนี้
คำจำกัดความ "ถูกต้อง" ของ "ขั้นตอน", "วิธีการ", "ฟังก์ชั่น", "รูทีนย่อย" ฯลฯ คืออะไร?
คำตอบ:
ฉันจะไปกับคำตอบที่แตกต่างกันที่นี่: พูดจริงมีความแตกต่างจริง ๆด้วยข้อยกเว้นเล็กน้อยว่า "วิธีการ" มักจะหมายถึงรูทีนย่อยที่เกี่ยวข้องกับวัตถุในภาษา OO
คำว่า "โพรซีเดอร์ฟังก์ชันรูทีนย่อยโปรแกรมย่อยและเมธอด" หมายถึงสิ่งเดียวกันทั้งหมดนั่นคือโปรแกรมย่อย callable ภายในโปรแกรมที่มีขนาดใหญ่กว่า แต่มันยากที่จะเกิดขึ้นกับคำจำกัดความที่รวบรวมการใช้คำศัพท์ที่แตกต่างกันทั้งหมดของคำเหล่านี้เพราะพวกมันไม่ได้ใช้อย่างสม่ำเสมอในภาษาโปรแกรมหรือกระบวนทัศน์
คุณอาจพูดว่าฟังก์ชั่นคืนค่า ฟังก์ชั่น C ต่อไปนี้จะไม่ส่งคืนค่า:
void f() { return; }
... แต่ฉันสงสัยว่าคุณจะพบใครก็ตามที่จะเรียกมันว่ากระบวนการ
แน่นอนใน Pascal ขั้นตอนจะไม่ส่งคืนค่าและฟังก์ชั่นคืนค่า แต่เป็นเพียงภาพสะท้อนของวิธีการออกแบบ Pascal ใน Fortran ฟังก์ชันจะคืนค่าและรูทีนย่อยจะคืนค่าหลายค่า แต่สิ่งเหล่านี้ไม่ได้ทำให้เรามีคำจำกัดความ "สากล" สำหรับคำเหล่านี้
ในความเป็นจริงคำว่า "การเขียนโปรแกรมตามขั้นตอน" หมายถึงภาษาทั้งชั้นรวมถึง C, Fortran และ Pascal เพียงหนึ่งในนั้นที่ใช้คำว่า "ขั้นตอน" ในความหมายอะไร
ดังนั้นสิ่งนี้ไม่สอดคล้องกันจริงๆ ข้อยกเว้นเพียงอย่างเดียวอาจเป็น "วิธีการ" ซึ่งดูเหมือนว่าจะใช้เกือบทั้งหมดกับภาษา OO หมายถึงฟังก์ชั่นที่เกี่ยวข้องกับวัตถุ แม้ว่าจะไม่สอดคล้องกันเสมอไป ตัวอย่างเช่น C ++ มักใช้คำว่า "member function" แทน method (แม้ว่าคำว่า "method" จะพุ่งเข้าไปในภาษา C ++ ในภาษาโปรแกรมเมอร์)
ประเด็นคือไม่มีสิ่งใดที่สอดคล้องกันจริงๆ มันสะท้อนให้เห็นถึงคำศัพท์เฉพาะที่ใช้ในทุกภาษา
ฟังก์ชั่นส่งกลับค่า แต่ขั้นตอนไม่ได้
วิธีการคล้ายกับฟังก์ชั่น แต่ภายในเพื่อเป็นส่วนหนึ่งของชั้นเรียน วิธีการใช้คำศัพท์เฉพาะในการเขียนโปรแกรมเชิงวัตถุ
function
จะเติมเต็มทั้งบทบาทใน JS แต่ฟังก์ชั่น JS กลับคืนมาทั้งหมด undefined
เมื่อคำสั่งกลับไม่มีค่าค่าปริยาย เมื่อไม่มีการส่งคืนสินค้าล่ามจะเพิ่มคำสั่งส่งคืนโดยนัย ลึกลับ แต่อาจจะสอดคล้องกับคำนิยามที่ให้ไว้ที่นี่ นี่คือเหตุผลที่var x = function() {}();
ถูกกฎหมายใน JS; หากไม่ใช่สำหรับการส่งคืนโดยปริยายสิ่งนี้จะต้องเป็นข้อผิดพลาดเนื่องจากเป็น Pascal
ฟังก์ชั่นเป็นสิ่งที่ต้องใช้เวลาพวงของปัจจัยการผลิตและผลตอบแทนอย่างน้อยหนึ่งค่า หากค่าที่ส่งคืนถูกกำหนดโดยอินพุตทั้งหมดและฟังก์ชันไม่มีผลข้างเคียงใด ๆ (การบันทึกอาจหรือทำให้เกิดการเปลี่ยนแปลงสถานะภายนอกตัวเอง) แสดงว่าเป็นฟังก์ชันที่บริสุทธิ์
ขั้นตอนคือฟังก์ชั่นที่ไม่ได้กลับมาเป็นค่า โดยเฉพาะอย่างยิ่งนี่หมายความว่ากระบวนการสามารถทำให้เกิดผลข้างเคียงเท่านั้น (นั่นอาจรวมถึงการกลายพันธุ์พารามิเตอร์อินพุต!)
วิธีคือฟังก์ชั่นที่ปิดมากกว่าชุดของตัวแปรที่เป็นที่ปิด ใช้พารามิเตอร์อินพุตเป็นศูนย์หรือมากกว่ามีการเข้าถึงชุดของตัวแปรนี้และส่งกลับค่าศูนย์หรือมากกว่า ในภาษา OO วิธีการเหล่านี้จะแนบกับวัตถุหรือคลาส
ในภาษา OO ที่เป็นกระแสหลักส่วนใหญ่ตัวแปรปิดที่เรียกว่าเขตข้อมูลสมาชิกหรือตัวแปรอินสแตนซ์ของวัตถุ วิธีการอาจเป็นฟังก์ชั่นที่บริสุทธิ์ฟังก์ชั่นที่ไม่บริสุทธิ์หรือขั้นตอน
นิยามหลังนำไปสู่object = struct + closures correspondence
foo.doSomething()
ไม่ได้เป็นแบบไม่มีพารามิเตอร์ มันมีหนึ่งพารามิเตอร์ (วัตถุfoo
) ด้วยให้กับน้ำตาล syntactic การปิดจะสามารถอ้างอิงวัตถุได้โดยไม่จำเป็นต้องใช้พารามิเตอร์ดังกล่าว นั่นไม่ได้เป็นการบอกว่าวิธีการไม่สามารถปิดได้ แต่ส่วนใหญ่ไม่ใช่และการเป็น OO นั้นไม่เพียงพอสำหรับภาษาที่จะสนับสนุนการปิด
foo.doSomething()
ปิดfoo
ตัวแปร ข้อความใด ๆ ในdoSomething
สามารถเข้าถึงfoo
ผ่านthis
หรือself
ขึ้นอยู่กับภาษาของคุณ นี่คือคำจำกัดความของ "ปิด" คลาสใกล้กับตัวแปรสมาชิกดังนั้น (ละเว้น "what OO"), OO เพียงพอ เรื่องนี้เป็นที่รู้จักกันดีในวรรณคดี ...
foo.
ที่ด้านหน้าของfoo.doSomething()
? นั่นคือคุณผ่านdoSomething()
พารามิเตอร์ เพียงเพราะมันไม่ได้อยู่ในวงเล็บไม่ได้หมายความว่ามันไม่ใช่พารามิเตอร์ this
หรือself
ภายในวิธีการที่น้ำตาลประโยคเพียงเพื่ออ้างอิงพารามิเตอร์ที่
บรูซมีคำตอบที่ดี ฉันจะเพิ่มความหมาย:
printf
)A procedure should "do something" to the arguments
- หรือทำให้เกิดผลข้างเคียงอื่น ๆ (เช่นprintf
)
printf
จะส่งคืนค่า - จำนวนอักขระที่พิมพ์ - ดังนั้นจึงเป็นฟังก์ชันทางเทคนิค
printf
มีค่า มันมีผลข้างเคียงที่เฉพาะเจาะจงนอกขอบเขตการร้องขอ: คือ I / O กับสิ่งที่เอาต์พุตมาตรฐานที่ควรจะเป็น ถึงแม้ว่าสกอตต์จะไม่แยกความแตกต่างนี้อย่างชัดเจนในฟังก์ชั่นการตั้งโปรแกรมการทำงานไม่ควรมีผลข้างเคียงและควรจะสามารถตอบคำถามราวกับว่าคุณมีข้อมูลจริงที่มันส่งคืน
คำตอบโดยละเอียดดีด้านบน เรื่องสั้นคือพวกเขาจะได้ลิ้มรสของรูทีนย่อย สิ่งที่มีความหมายโดยแต่ละคำจะแตกต่างกันไปตามบริบทภาษาการเขียนโปรแกรม
โดยทั่วไปฟังก์ชั่นคืนค่า แต่พวกเขาไม่จำเป็นต้อง
วิธีการเป็นข้อกำหนด OOP ทั่วไปในปัจจุบัน
ใน SQL โพรซีเดอร์ที่เก็บไว้มีเอาต์พุต แต่โดยทั่วไปแล้วจะส่งคืนรหัสข้อผิดพลาดเท่านั้นในขณะที่ฟังก์ชันที่ผู้ใช้กำหนดต้องส่งคืนค่า (ซึ่งอาจเป็นชุดผลลัพธ์)
ความแตกต่างที่ชัดเจนระหว่างข้อกำหนดเหล่านี้ขึ้นอยู่กับว่าคุณกำลังพูดคุยกับใคร!
80% ของความเชี่ยวชาญเกี่ยวข้องโดยตรงกับความคุ้นเคยกับระบบการตั้งชื่อ
95% ของผลิตภาพคือความสามารถในการระบุสิ่งที่มีประโยชน์ในขณะนี้แม้จะมีคำศัพท์ที่ใช้อธิบาย
ฉันอยากจะเรียกพวกเขาว่าวิธีการทั้งหมดใน c # ยกเว้นเมื่อฉันใช้ MSSQL เรามี sproc แต่แน่นอนตอนนี้เราใช้ Postgres และพวกเขาเรียกว่าฟังก์ชั่น