แยกไฟล์ - แยกเท่าไหร่?


9

ถ้าฉันบอกว่าฉันมีกรอบเอนทิตี้ของลำดับชั้นมากกว่ารูปแบบองค์ประกอบ สิ่งที่ชอบ:
(ใช่มันถูกสร้างขึ้น)

อาวุธ -> ปืน -> AutomaticGun-> MP44
หรือตัวอย่างคลาสสิกเพิ่มเติม:
Entity-> MovableEntity-> Enemy-> WalkingEnemy

ไกลแค่ไหนที่คุณจะแยกไฟล์ที่มา / ส่วนหัวสำหรับการอ่านและองค์กร? มันจะดีกว่าไหมถ้าไปที่ Entity.cpp, MovableEntity.cpp, Enemy.cpp เป็นต้นหรือจะใช้วิธีเช่น Entity.cpp [บรรจุ Entity และ MovableEntity] และ Enemy.cpp [บรรจุ Enemy and WalkingEnemy] ดีกว่าไหม? (หรือในทางที่ไม่เชื่อเรื่องภาษามากขึ้นไฟล์ Enemy และ Entity ไฟล์เทียบกับไฟล์สำหรับแต่ละคลาส?)
นอกจากนี้สิ่งนี้จะส่งผลกระทบต่อสิ่งอื่นใดนอกจากการอ่านและการจัดระเบียบ?


1
Nitpicky แต่ฉันไม่คิดว่าlanguage-agnosticเป็นแท็กที่เหมาะสมเนื่องจากขึ้นอยู่กับภาษาที่คุณใช้เป็นอย่างมากกับผลข้างเคียง
Tetrad

จุดดีฉันคิดว่าฉันสามารถ retag
The Duck Communist

คำตอบ:


12

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

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

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


ตกลง ความซับซ้อนของประเภทของคุณควรเป็นปัจจัย หากภาษาของคุณรองรับคลาสบางส่วน (หรือหากการจัดระบบสมาชิกสามารถจัดการคล้ายกับ C ++) ได้ฉันก็ขอแนะนำให้แบ่งประเภทที่ซับซ้อนเป็นพิเศษออกเป็นหลายไฟล์ ตัวอย่างเช่นถ้ามีอินเทอร์เฟซ (ใหญ่) ที่คลาสของคุณต้องนำไปใช้ แต่รหัสนั้นค่อนข้างทั่วไปและไม่เกี่ยวข้องกับส่วนที่เหลือคุณสามารถแบ่งรหัสนั้นออกเป็นไฟล์ / ชั้นบางส่วนที่แยกต่างหาก สำหรับประเภท enum ฉันคิดว่าคุณสามารถหลีกเลี่ยงการวาง enums ทั้งหมดสำหรับเนมสเปซที่กำหนดภายในไฟล์เดียว
Mike Strobel

1
การจัดกลุ่ม enums ของคุณไม่ได้หมายความว่าการเปลี่ยนค่าเดียวจะทำให้คอมไพล์ของทุกไฟล์ที่ใช้ enum ในเนมสเปซนั้นหรือไม่
The Communist Duck

นั่นขึ้นอยู่กับภาษา แต่จริงๆแล้วมันอาจมีผลกระทบอย่างแน่นอน มันไม่ได้เป็นปัญหาสำหรับฉันอย่างที่ฉันพัฒนาเป็นหลักใน C # (ไม่มีการคอมไพล์แบบไฟล์ต่อไฟล์) แต่อาจเป็นปัญหาใน C ++ และภาษาอื่น ๆ เช่นเคยมีปัจจัยเฉพาะทางภาษาที่ต้องพิจารณาและนั่นจะเป็นหนึ่งในนั้น :)
Mike Strobel

2

หลายภาษานอก C / C ++ กำหนดข้อ จำกัด ในไฟล์ Ricket พูดถึง Java 'หนึ่งคลาสต่อไฟล์'; Python ใช้ไฟล์เป็น namespaces ภาษาอื่นมักจะลอกเลียนแบบจิตวิญญาณของสิ่งเหล่านั้น

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

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

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


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