ชื่อ 'ข้อมูลจำเพาะ' ของฟังก์ชั่น / วิธีคืออะไร?


21

ฉันค่อนข้างแน่ใจว่ามีชื่อพิเศษสำหรับ 'ข้อมูลจำเพาะ' ของฟังก์ชัน / วิธี มันเป็นคำที่หมายถึง

  • ต้องใช้อาร์กิวเมนต์กี่ครั้ง
  • ลำดับของการขัดแย้ง
  • อาร์กิวเมนต์ใดเป็นตัวเลือก

มีชื่อไหม?


2
มี "สเปค" ที่แตกต่างกันสองสามแบบ คุณพูดถึงประเภทอาร์กิวเมนต์คำสั่งซื้อและความจำเป็น นำมารวมกับประเภทการคืนสินค้าซึ่งเรียกว่าลายเซ็นประเภท คุณพิจารณาชื่อของฟังก์ชันส่วนหนึ่งของข้อมูลจำเพาะหรือไม่? แล้วเนมสเปซของมันเช่น class, package, module, etc. ? ข้อกำหนดนี้สำหรับโปรแกรมเมอร์หรือเครื่องหรือไม่? ดูคำตอบของฉัน
kdbanman

4
ฉันประหลาดใจที่คำถามนี้มีคะแนนโหวต 4 คะแนน - เป็นคำถามที่ถูกต้องตามกฎหมายอย่างสมบูรณ์ IMHO และตอบได้ค่อนข้างดี (อันที่จริงมีการตอบแล้ว)
sleske

@ คอลลัมโปรดแก้ไขคำถามของคุณให้คลุมเครือน้อยลงเพื่อให้สามารถยกเลิกการติดแท็กได้ คุณกังวลเกี่ยวกับภาษาใดภาษาหนึ่งหรือไม่? สเป็คเครื่องหรือโปรแกรมเมอร์สเป็ค? spec สำหรับการโทรหรือ spec สำหรับการนำไปใช้?
kdbanman

1
@kdbanman ฉันแค่พยายามจำคำว่า "ลายเซ็น" มันไม่ได้คลุมเครือ ไม่ใช่ภาษาเฉพาะ ได้รับคำตอบแล้ว ไม่เป็นไร.
callum

@ คอลลัมนั่นคือสิ่งที่ฉันคิด ขอบคุณสำหรับการตอบกลับ.
kdbanman

คำตอบ:


47

นี้มักจะเรียกว่าลายเซ็นประเภท

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


6
โดยปกติ? ฉันคุ้นเคยกับ "ต้นแบบ" ซึ่งเห็นได้ชัดว่าเป็นลายเซ็นประเภทพร้อมชื่อ - en.wikipedia.org/wiki/Function_prototype
ShadSterling

14
@ โพลีเมอริกซิกเนเจอร์ทั่วไปมากกว่าต้นแบบ (และถูกต้องมากกว่าในกรณีนี้): ต้นแบบประกาศลายเซ็น โดยเฉพาะอย่างยิ่ง "ต้น" หมายถึงการประกาศโดยไม่ต้องดำเนินการตามที่ประกาศใน Java หรือ C # วิธีการในinterfaceหรือการประกาศฟังก์ชั่น C / C ++ ในไฟล์ส่วนหัว (เรียกว่า a prototype)
kdbanman

12
นอกจากนี้arityเป็นคำศัพท์ที่ใช้กันน้อยกว่าสำหรับจำนวนอาร์กิวเมนต์เท่านั้น
Sebi

^ Ooh นั่นคือสิ่งที่น่าสนใจ! ฉันจะต้องจำไว้ว่าเมื่อฉันตะลุยเจเอสเนื่องจากฉันมีเพียงการนับอาร์กิวเมนต์เพื่อนำทางฉันไม่ใช่ประเภท
underscore_d

23

TL; DR คุณอาจกำลังพูดถึงลายเซ็นของฟังก์ชั่น (หรือลายเซ็นเมธอด) ส่วนหนึ่งเป็นลายเซ็นประเภท

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

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

การพูดอย่างเคร่งครัดลายเซ็นของฟังก์ชั่น (หรือวิธีการ) ไม่ใช่คำที่สอดคล้องกัน2, 3แม้จะอยู่ในภาษาเดียวกัน 4, 5, 6, 7 แต่มันก็เกือบจะเป็นคำที่คุณมองหาเพราะโปรแกรมเมอร์เกือบทุกคนจะเข้าใจ


  1. C ++ Spec Draft n337, นิยาม 1.3.17, signature ไม่รวมชนิด return เนื่องจากไม่จำเป็นต้องแก้ไขฟังก์ชั่น

  1. "ลายเซ็น" ไม่รวมข้อมูลเนมสเปซ
  2. "ลายเซ็น" รวมถึงข้อยกเว้นและการปรับเปลี่ยนเช่นpublic, staticฯลฯ

  1. C ++ "ลายเซ็น" ไม่รวมประเภทส่งคืน
  2. C ++ "ลายเซ็น" ไม่รวมประเภทกลับ
  3. C ++ "ลายเซ็น" ไม่รวมประเภทการส่งคืนยกเว้นว่าฟังก์ชันนั้นเป็นความเชี่ยวชาญเฉพาะของแม่แบบ
  4. C ++ "ลายเซ็น" รวมถึงข้อมูลเนมสเปซ (ขอบเขต) และสิ่ง "เบ็ดเตล็ดอื่น ๆ " ...


ฉันจะรวมอย่างน้อยสิ่งที่วิธีการเมื่อพูดถึง "spec" ของมัน ขึ้นอยู่กับการมุ่งเน้นของวันที่ฉันอาจหรือไม่อาจรวมถึงข้อมูลเพิ่มเติมใด ๆ ที่จำเป็นในการใช้วิธีการ
CVn

@ MichaelKjörlingสิ่งเหล่านี้เป็นข้อกังวลที่ถูกต้อง แต่สิ่งเหล่านี้เป็นคำพูดที่สำคัญมากจากสิ่งที่โปรแกรมเมอร์ส่วนใหญ่เรียกว่า "ลายเซ็น" ฟังก์ชันควรรวมอยู่ในชื่อฟังก์ชันดังนั้นจึงเป็นส่วนหนึ่งของลายเซ็นทางอ้อม ไม่ว่าฉันจะไม่คิดว่าการทำงานหรือการใช้งานเป็นสิ่งที่ผู้ถามตั้งใจ ฉันจะแก้ไขตามหากปรากฏว่าเขาทำ
kdbanman

ลายเซ็นใช่ "ข้อมูลจำเพาะ" ไม่ใช่ (FWIW ฉันคิดว่าคำตอบของคุณค่อนข้างดีและได้รับการกล่าวถึงอย่างดี)
CVN

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

1
โหวตขึ้นเพราะถึงแม้ว่าจะไม่language-agnosticตัวอย่าง C ++ นั้นเป็น (A) ที่เกี่ยวข้องกับฉันและ (B) เป็นตัวอย่างของความสับสนที่มักจะล้อมรอบคำศัพท์ของมนุษย์
underscore_d

0

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


นี่คือคำตอบที่ดีที่สุดถ้าคำถามเป็นชื่อสำหรับ "ข้อมูลจำเพาะ" ของฟังก์ชัน / วิธีการ ลายเซ็นเองนั้นไม่ได้บอกอะไรเกี่ยวกับสิ่งที่วิธีการทำจริง, อนุญาตให้ใช้ช่วงของพารามิเตอร์, ข้อ จำกัด ที่ไม่ใช่ฟังก์ชันและอื่น ๆ ...
ch7kor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.