อะไรคือจุดที่ทำให้เกิดความแตกต่างทางวากยสัมพันธ์ระหว่างชนิดมาตรฐานและแบบที่ผู้ใช้กำหนด?


13

แม้ว่าที่นี่ฉันจะอ้างถึงข้อตกลงการตั้งชื่อของ C ++ และBjarne Stroustrupโดยหลักการแล้วฉันเห็นว่าผู้คนใช้กฎที่คล้ายกันสำหรับภาษาอื่นที่นี่และที่นั่น

ดังนั้นแนวคิดพื้นฐานคือควรจะแยกแยะชนิดมาตรฐานจากประเภทที่ผู้ใช้กำหนดในขณะที่อ่านโค้ด ตัวอย่างเช่น Bjarne Stroustrup แนะนำว่ามีการใช้

อักษรตัวใหญ่เริ่มต้นสำหรับประเภท (เช่น Square และกราฟ)

ซึ่งคำนึงถึงว่า

ภาษา C ++ และไลบรารีมาตรฐานไม่ใช้ตัวพิมพ์ใหญ่

อนุญาตให้บรรลุเป้าหมายดังกล่าวข้างต้น

แต่ทำไมเราต้องทำเช่นนั้น? อะไรคือจุดประสงค์ของการแยกประเภทมาตรฐานและประเภทที่ผู้ใช้กำหนด?

ฉันไม่สามารถหาเหตุผลของ Bjarne Stroustrup เกี่ยวกับเรื่องนั้นได้และนอกจากนี้ฉันเองก็คิดตรงกันข้าม : DI รู้ฉันรู้ "ฉันเป็นใครที่จะโต้แย้ง Stroustrup?" แต่ฟังคุณสมบัติของภาษา C ++ เช่นตัวดำเนินการโอเวอร์โหลดมีวัตถุประสงค์เพื่อให้ประเภทที่ผู้ใช้กำหนดมีระดับการสนับสนุนทางไวยากรณ์ที่คล้ายกันเป็นประเภทมาตรฐาน และทั้งหมดนี้ก็ทำให้งงงวยโดยวินัยการตั้งชื่อที่แตกต่างกัน ...

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


6
ในที่สุดคุณสามารถเรียกมันว่ารูปแบบของรูปแบบของฮังการีเช่นกัน (เช่นการฝังข้อมูลเกี่ยวกับประเภท / การใช้งานในชื่อ) ซึ่งมักจะขมวดคิ้ว ดังนั้นคำถามที่ดี
stijn

2
@stijn: ใช่ แต่คุณรู้ไหมว่าทำไมมันถึงขมวดคิ้ว? ย้อนกลับไปในวันนี้เมื่อทุกคนใช้ตัวแก้ไขข้อความเพื่อเขียนโปรแกรมของพวกเขามันมีประโยชน์ที่จะรู้ประเภทโดยดูที่ตัวระบุ แต่วันนี้คุณสามารถโฮเวอร์เหนือตัวบ่งชี้ใน IDE สมัยใหม่ใด ๆ และมันจะบอกคุณถึงประเภท
Robert Harvey

4
@RobertHarvey ยกเว้นว่าสัญกรณ์ฮังการีจะถูกซ่อนอยู่ในชุมชนที่ไม่มี IDEs ที่ทรงพลังหรือใช้ตัวแก้ไขข้อความธรรมดาเป็นส่วนใหญ่

1
@RobertHarvey ไม่ฉันรู้ทั้ง ("แอพฮังการี" และ "ระบบฮังการี") และจากประสบการณ์ของฉันไม่พบว่าเป็นเรื่องธรรมดาเช่น Python และ Rust

3
@RobertHarvey คุณกำลังบอกว่ามีสัญกรณ์ฮังการีอยู่ใน C, C ++ และ VB เท่านั้นหรือเปล่า? โดยไม่คำนึงถึงประเด็นของฉันคือการตั้งคำถามว่าคุณให้เหตุผลอะไรกับการถูกขมวดคิ้ว (เพราะมันซ้ำซ้อนก็ต่อเมื่อเรามี IDE ที่บอกประเภท) เพราะเหตุผลนั้นใช้กับภาษาที่ไม่มีรหัสดังกล่าวและ โดยเหตุผลของคุณควรได้รับประโยชน์จากฮังการี Python นั้นถูกพิมพ์แบบไดนามิกทำให้ไม่แตกต่างกันในความเป็นจริงมันควรปรับปรุงการให้เหตุผลเพราะโดยทั่วไปแล้วโปรแกรมเมอร์จะรู้ชนิดเมื่อเขียนรหัส แต่พวกมันไม่สามารถอนุมานได้โดยอัตโนมัติ

คำตอบ:


5

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

เมื่อพูดถึงการตั้งชื่อ Stroustrup เป็นถั่วและนี่คือความจริงที่ได้รับการพิสูจน์ทางวิทยาศาสตร์แล้ว


2
ฉันจะเห็น RAII ของคุณและสร้าง SFINAE ให้คุณ
Robert Harvey

5
ฉันเห็นว่ามันอาจมีประโยชน์ในการแยกประเภทมาตรฐานจาก UDT อย่างไร คุณไม่ควรเปลี่ยนรหัสในไลบรารีมาตรฐานเว้นแต่คุณจะมีเหตุผลที่ดีจริงๆดังนั้นการเห็นตัวพิมพ์เล็กแสดงว่าคุณไม่ต้องไปดูรหัสเพราะดีในห้องสมุดมาตรฐาน
Robert Harvey

4
@delnan: ใช่ นั่นไม่ได้เป็นอะไรมากไปกว่าการดึงดูดผู้มีอำนาจในส่วนของ "คนจำนวนมาก" หาก "คนจำนวนมาก" ต้องการมาที่นี่และพูดคุยเกี่ยวกับเหตุผลของพวกเขาพวกเขามีอิสระที่จะทำเช่นนั้นและจนกว่าจะถึงตอนนั้นพวกเขาไม่มีอะไรเพิ่ม FTR ฉันใช้ตัวพิมพ์ใหญ่สำหรับ UDT ด้วย ... แต่สำหรับ primitives ทุกครั้งที่ฉันต้องใช้นามแฝง
DeadMG

2
@RobertHarvey: ถือว่าคุณไม่รู้จักประเภท Standard ที่เห็น หรือโดยการวางเมาส์เหนือพวกเขาในสภาพแวดล้อมของคุณและเห็น "std ::" หรือโดยใช้ Go To Definition หรืออะไรก็ตาม ดังนั้นโดยทั่วไปมันใช้ไม่ได้
DeadMG

1
ฉันคิดเสมอว่าจุดประสงค์คือการแยกความแตกต่างจากแบบมาตรฐานก่อนการมาถึงของเนมสเปซ ทุกวันนี้มันเป็นเพียงความคิดที่ระลึกแบบเก่า ("แนวปฏิบัติที่ดีที่สุด" ที่หยุดดีที่สุดเมื่อไม่นานมานี้) FWIW ในโครงการส่วนบุคคลของฉันฉันใช้ตัวอักษรขนาดเล็กsnake_caseสำหรับการเรียนและ namespaces ของฉันและได้ไม่มีปัญหา - หรือความสับสน - เกิดจากนี้เลย
utnapistim

3

อนุสัญญาการตั้งชื่อเกี่ยวกับการสนับสนุนความเข้าใจของมนุษย์ (เช่นโปรแกรมเมอร์และผู้ดูแล) รหัส

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

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


2

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

Foo foo;
Graph graph;

สิ่งนี้มีประโยชน์สำหรับคลาสที่มีเพียงอินสแตนซ์เดียวเท่านั้นที่ใช้ในแต่ละบริบทเช่นการตั้งค่าการกำหนดค่า


IMHO สิ่งนี้ไม่ตอบคำถามในหัวข้อ อาจเพิ่ม "ในส่วนนี้การตั้งชื่อประเภทมาตรฐานด้วยตัวอักษรขนาดเล็กเป็นเพียงความเข้ากันได้ย้อนหลังกับ cstdlib"
Vorac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.