การมีไฟล์ส่วนหัว C ++ ที่ไม่มีส่วนขยายนั้นเป็นแนวปฏิบัติที่ดีหรือไม่?


9

ฉันมีข้อโต้แย้งกับเพื่อนร่วมงานของฉันเกี่ยวกับแนวทาง C ++ ที่ต้องปฏิบัติตาม

ปัจจุบันเขาออกแบบห้องสมุดทั้งหมดของเขาด้วยวิธีนี้:

  • เขาใช้ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กไม่ต่อเนื่องในชื่อไฟล์ของเขา
  • ส่วนหัวบางส่วนของเขาไม่มีส่วนขยายใด ๆ

ฉันเชื่อว่าการไม่มีส่วนขยายเป็นสิ่งที่สงวนไว้สำหรับไฟล์มาตรฐาน C ++ และการใช้ตัวอักษรตัวพิมพ์ใหญ่นั้นเกิดข้อผิดพลาดได้ง่าย (โดยเฉพาะอย่างยิ่งเมื่อคุณจัดการกับรหัสซึ่งมีความหมายว่าจะทำงานกับทั้ง Windows และ Linux)

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

ตอนนี้ฉันพยายามเปิดใจ แต่ฉันรู้สึกแย่จริง ๆ เมื่อฉันต้องทำงานกับห้องสมุดของเขา มีกฎทั่วไปที่กำหนดขึ้นเกี่ยวกับเรื่องนี้หรือไม่? มาตรฐานบอกอะไรเกี่ยวกับมันบ้างไหม?

ขอบคุณมาก.


3
#define signal……… (“ ถ้า Qt ทำแบบนั้นมันก็ไม่เลวเลย”) - ฉันไม่สามารถพูดได้ว่าฉันเห็นด้วยกับตัวเลือกการออกแบบทั้งหมดของพวกเขา
justin

@ จัสติน: ฉันก็ไม่ได้ทำอะไรQtเลย ฉันยังคิดว่ามันเป็นห้องสมุดที่น่าทึ่ง แต่ตัวเลือกการออกแบบบางอย่างของฉันรู้สึกผิดกับฉัน
ereOn

1
@ จัสตินฉันเห็นมาโครเริ่มต้นด้วยรหัส_ยอดนิยมที่ใช้กันแพร่หลาย แต่มันก็ขัดกับมาตรฐาน
Luchian Grigore

1
แต่นี่คือเหตุผลหนึ่งที่แท้จริงในการหลีกเลี่ยงส่วนหัวที่ไม่มีส่วนขยาย: IDE หลักและตัวแก้ไขข้อความของฉันจะไม่จดจำส่วนหัวโดยอัตโนมัติ ฉันใช้*.hppสำหรับส่วนหัว c ++ และเครื่องมือทั้งหมดของฉัน "รับไป"
justin

5
Qt ใช้การประชุมนั้นอย่างแน่นอนเพราะโปรแกรมเมอร์อัจฉริยะไม่ได้ หมายความว่าส่วนหัวของคุณจะไม่ขัดแย้งกับส่วนหัว Qt ใหม่
MSalters

คำตอบ:


16

ส่วนขยาย (หรือขาด) จะไม่เกิดขึ้นเท่าที่ฉันรู้ทำให้คุณมีปัญหา ฉันจะบอกว่าการวางส่วนขยายทั้งหมดนั้นไม่สะดวกเพราะทำให้ยากต่อการค้นหาไฟล์ส่วนหัว (ตัวอย่างเช่น wildcard * .h และ * .hpp) และทำให้การระบุเนื้อหาของไฟล์ทำได้ยากขึ้น (ตัวอย่างเช่นหาก โปรแกรมแก้ไขของคุณใช้ส่วนขยายเพื่อเลือกโหมดการเน้นไวยากรณ์ที่เหมาะสม)

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

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


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

@kotlinski นี่เป็นหนึ่งในกรณีที่ไม่มีอะไรที่คุณสามารถทำได้เพื่อปรับปรุงสถานการณ์เพราะสิ่งที่คุณเลือกเป็นเรื่องของการตั้งค่า ที่จริงแล้วมีนามสกุลบางอย่างดีกว่าไม่มีเลยเพราะ OS (อ่าน, Windows) สามารถกำหนดโปรแกรมที่จะเปิดไฟล์ด้วยส่วนขยาย
พอล

@PaulManta: แต่คุณไม่เถียงกับตัวเองที่นี่เหรอ? ก่อนอื่นคุณพูดว่าไม่มีทางที่จะปรับปรุงอะไร จากนั้นคุณบอกว่าการมีส่วนขยายนั้นดีกว่าไม่ นั่นเป็นทัศนคติแบบพ่ายแพ้ซึ่งบอกว่าไม่มีความเปลี่ยนแปลงใด ๆ
kotlinski

@kotlinski โดยทั่วไปฉันเดาว่าขึ้นอยู่กับว่าคุณใช้รหัสเก่าเท่าไรไม่ว่าจะเป็นการเปลี่ยนแปลงทั้งหมดในการประชุมใหม่หรือไม่และผลกระทบของการประชุมแบบผสมจะเป็นอย่างไร ในกรณีนี้แม้ว่าฉันจะเห็นด้วยกับ Paul Manta - ส่วนใหญ่เป็นการตั้งค่าส่วนตัวโดยมีส่วนขยายที่เป็นที่ต้องการมากที่สุดสำหรับเหตุผลที่ปฏิบัติได้
Adam Bowen

1
@kotlinski ไม่มีทางที่จะปรับปรุงอะไร แต่มีวิธีที่จะทำให้สิ่งต่าง ๆ แย่ลง การสนทนานี้ไม่มีจุดหมายเหมือนกับการสนทนา spaces-vs-tabs เพียงแค่เลือกหนึ่งการประชุมและทำสิ่งที่มีประโยชน์
พอล

6

ไม่มีกฎ (ในมาตรฐาน) ที่ไฟล์ส่วนหัวมาตรฐานเท่านั้นที่สามารถไม่มีได้ ชื่อไฟล์สามารถเป็นอะไรก็ได้ที่คุณต้องการ อย่างไรก็ตามแนวปฏิบัติที่ดีทั่วไปแสดงให้เห็นว่า:

  1. ไม่มีไฟล์ใดที่จะไม่มีส่วนขยายและ

  2. ไฟล์ประเภทต่าง ๆ มีส่วนขยายต่างกันโดยเฉพาะส่วนหัว C ++ ใช้ส่วนขยายที่แตกต่างกัน ( .hppหรือ.hh) กว่าส่วนหัวที่ยอมรับโดยคอมไพเลอร์ C

(น่าเศร้ากฎข้อที่สองก็มักจะละเมิดและหนึ่งมักจะเห็น C ++ ไฟล์ส่วนหัวกับ.h. จากประสบการณ์ส่วนตัวผมสามารถมั่นใจได้ว่านี้จะทำให้เกิดปัญหาการบำรุงรักษาลงที่ถนน แต่มันก็เป็นเรื่องธรรมดา.)

ในกรณีที่จำเป็นต้องใช้ความระมัดระวังอย่างยิ่งเนื่องจากชื่อไฟล์จะต้องตรงตามตัวพิมพ์เล็กและใหญ่ในบางระบบและไม่ใช่ในชื่ออื่น ฉันได้เห็นกฎที่แตกต่างกันสองข้อที่ใช้งานได้: ทุกอย่างเป็นตัวพิมพ์เล็กในชื่อไฟล์หรือชื่อไฟล์เป็นไปตามกฎเดียวกันเกี่ยวกับตัวพิมพ์เล็กสำหรับสัญลักษณ์ใน C ++

ในทั้งสองกรณีคุณสร้างกฎสำหรับโครงการโดยฉันทามติและทุกคนติดตามพวกเขา


1
ฉันอยู่กับเจมส์ในเรื่องนี้โดยสิ้นเชิง มันทำให้ฝันร้ายเป็นเครื่องมือในการทำงานอย่างเหมาะสมกับไฟล์ส่วนหัว 2 ประเภทที่แตกต่างกันหากมีนามสกุลเดียวกัน

@TomTanner และมันยิ่งแย่กว่านี้ถ้าคุณมีไฟล์ที่ไม่มีนามสกุล ฉันส่วนใหญ่ทำงานในสภาพแวดล้อม Unix และมันทำให้ฉันผิดหวังเสมอ (และทำให้เกิดปัญหา) ไฟล์ที่ปฏิบัติการได้ไม่มีส่วนขยาย

6
If Qt does it that way, then it can't be bad.

ใช่. ใช่มันสามารถทำได้จริงๆ การออกแบบห้องสมุดของพวกเขาคือ "เราต้องการเป็นจาวา" มันยุ่งเหยิงไปหมด ห้องสมุดมาตรฐานดีกว่ามาก

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


มันเป็นข้อโต้แย้งเชิงประจักษ์ เป็นผลิตภัณฑ์ซอฟต์แวร์ขนาดใหญ่ที่หลายคนใช้ หากรูปแบบการตั้งชื่อตัวเลือกนี้ก่อให้เกิดปัญหาที่สำคัญจะเป็นที่รู้จักและอาจมีการเปลี่ยนแปลงในตอนนี้ เช่นนี้ไม่เป็นเช่นนั้นมันไม่เลวร้ายนัก นั่นไม่ได้หมายความว่ามันเป็นทางออกที่ดีที่สุด
H. Rittich

0

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


3
Btw "ถ้า Qt ทำอย่างนั้นมันคงไม่เลว" มันเป็นข้อโต้แย้งที่ไม่ดีจริงๆ ...

2
มาตรฐานมีอะไรจะพูดเกี่ยวกับวิธีส่วนหัวที่ผู้ใช้กำหนดควรเป็นชื่อ มันระบุชื่อของส่วนหัวมาตรฐานเท่านั้น
Mike Seymour

0

การประชุมเหล่านี้ไม่ใช่กฎไม่มีข้อ จำกัด ในการปฏิบัติตามอนุสัญญา แต่การประชุมจะทำให้ชีวิตง่ายขึ้นเมื่อคุณมาเพื่ออ้างอิง

ตามนามสกุล (.h, .hpp) ไฟล์เหล่านั้นซึ่งรวมอยู่ใน c ++ ไม่จำเป็นต้องมีนามสกุลคุณจำเป็นต้องใช้ส่วนขยายหากคุณใช้ส่วนหัวจากที่อื่นที่ไม่ใช่ c ++ เช่นไลบรารี c หรือเพิ่มไลบรารี

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