หนึ่งคลาสต่อกฎไฟล์ใน. NET [ปิด]


185

ฉันปฏิบัติตามกฎนี้ แต่เพื่อนร่วมงานของฉันบางคนไม่เห็นด้วยกับมันและให้เหตุผลว่าถ้าชั้นเรียนมีขนาดเล็กลงก็สามารถปล่อยให้อยู่ในไฟล์เดียวกันกับชั้นเรียนอื่นได้

อีกข้อที่ฉันได้ยินตลอดเวลาคือ "แม้แต่ Microsoft ก็ไม่ทำเช่นนั้น

ฉันทามติทั่วไปเกี่ยวกับเรื่องนี้คืออะไร? มีกรณีที่ควรหลีกเลี่ยงสิ่งนี้หรือไม่?



ดูเพิ่มเติมที่: programmers.stackexchange.com/questions/121365/…
George Mamaladze

คำตอบ:


176

หนึ่งคลาสต่อไฟล์ยังช่วยให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับสิ่งที่การเช็คอินแต่ละครั้งเปลี่ยนไปโดยไม่ดูความแตกต่างของไฟล์


4
คลาสเพิ่มเติมในไฟล์เดียวกันจะเพิ่มความแตกต่างระหว่างคลาสที่เกี่ยวข้องในการดำเนินการเพียงครั้งเดียว
Luca

3
ผู้ชมต่างที่เหมาะสมช่วยให้คุณดูความแตกต่างทั้งหมดของการกระทำ
Dykam

44
ฉันไม่แน่ใจว่าคำตอบนี้เป็นคำตอบสำหรับคำถามของบทความหรือไม่ แน่นอนว่ามันมีเหตุผลในการเก็บไฟล์ไว้ 1 คลาส (แม้ว่า Luca และ Dykam จะให้คะแนนที่ดี) แต่มันไม่ได้สะท้อนถึงฉันทามติทั่วไปหรือจัดให้มีกรณีที่ควรหลีกเลี่ยง
Robert Davis

4
การปฏิบัติที่ดีที่สุดไม่มีอยู่หากคุณเชื่อในแนวทางปฏิบัติที่ดีที่สุดเข้าใจว่าจะใช้กับบริบทที่กำหนดเท่านั้น ดังที่คำตอบอื่น ๆ ชี้ให้เห็นมีบางครั้งที่กฎนี้จะสร้างรหัสที่สามารถบำรุงรักษาได้น้อยกว่า เมื่อเครื่องมือดีขึ้นกฎนี้จะมีความเกี่ยวข้องน้อยลงเนื่องจากสามารถหาคลาสและประเภทภายในโครงการได้ง่ายขึ้น
abombss

263

ฉันเกลียดเมื่อมีคนคิดในสมบูรณาญาสิทธิราชย์และพูดว่าคุณไม่ควรทำสิ่งนี้หรือสิ่งที่เป็นอัตนัยและจู้จี้จุกจิกเช่นนี้ราวกับว่าเราทุกคนจำเป็นต้องปฏิบัติตามแนวคิดของคนที่โง่และถูก Bottom line: การมีมากกว่าหนึ่งคลาสต่อหนึ่งไฟล์นั้นเป็นเรื่องปกติโดยสมบูรณ์ถ้ามันสมเหตุสมผล โดยความรู้สึกฉันหมายถึงสิ่งที่ชอบ:

  1. ทำให้โค้ดย่อยและบำรุงรักษาง่ายขึ้น
  2. ทำให้โซลูชันน่ารำคาญน้อยลง (เลื่อนดูไฟล์ที่ไม่จำเป็นนับไม่ถ้วน) และช้าลง
  3. ทีมนักพัฒนานั้นโอเคกับการฝึกเขียนโค้ดในท้องถิ่น

ตัวอย่างที่ดีมาก ๆ ว่าทำไมฉันถึงต้องการหลาย ๆ คลาสต่อไฟล์:

สมมติว่าฉันมีคลาสข้อยกเว้นแบบกำหนดเองไม่กี่โหลแต่ละอันมี 4 ไลเนอร์ฉันสามารถมีไฟล์แยกกันสำหรับแต่ละคนหรือฉันสามารถจัดกลุ่มข้อยกเว้นและมีไฟล์ต่อกลุ่ม สำหรับฉันสิ่งที่ดูเหมือนว่ามีเหตุผล / วิธีปฏิบัติมากที่สุดคือการจัดกลุ่มพวกเขาและมีเพียงไม่กี่ไฟล์เพราะมันมีประสิทธิภาพมากขึ้นเวลา / การเข้ารหัสที่ชาญฉลาด (ฉันไม่ต้องคลิกขวา -> เพิ่มคลาสเปลี่ยนชื่อ 50 ครั้ง) มันช่วยให้การแก้ปัญหาน้อยลงและทำงานได้ดีขึ้น


92
1000 การทำความเข้าใจเหตุผลสำหรับวิธีปฏิบัติที่ดีที่สุดและการคิดสองครั้งก่อนที่จะละเมิดนั้นดีมาก การปฏิบัติตาม Slavish เป็นสิ่งที่ชั่วร้าย
dsimcha

19
มีคลาสข้อยกเว้นที่กำหนดเองไม่กี่โหล ? นั่นไม่ใช่สาเหตุที่แท้จริงของปัญหาใช่ไหม ฉันไม่ได้หมายถึงการจู้จี้จุกจิกที่นี่: ฉันคิดว่าคนส่วนใหญ่ต้องการรวมคลาสเป็นไฟล์เดียวเพราะพวกเขาไม่จำเป็นต้องสร้างหลายประเภทมากเกินไป (ต้องบอกว่าอาจเป็นกรณีจริงที่คลาสเรียนยกเว้นข้อยกเว้นที่กำหนดเองไม่กี่โหล) คลาสขนาดเล็กและไม่มีคลาสเป็นสัญญาณของปัญหาที่ใหญ่กว่า
Jeff Sternal

16
ฉันเห็นด้วยกับคุณเป็นส่วนใหญ่ แต่ข้อยกเว้นเป็นกรณีพิเศษ เนื่องจากระบบที่ได้รับการออกแบบมาอย่างเหมาะสมจำเป็นต้องมีการจัดการข้อยกเว้นที่เหมาะสมเพื่อจัดการกับทุกกรณีที่ทำให้เกิดข้อผิดพลาดที่ถูกต้องบทความที่ดีที่สุดที่ฉันได้อ่านเน้นวิธีการสร้างข้อยกเว้นเฉพาะ (และบางครั้งคุณต้องการให้มาก ครอบคลุมกฏทางธุรกิจทั้งหมดในโครงการขนาดใหญ่) เพื่อที่คุณจะไม่ได้รับข้อผิดพลาด system.exception ซึ่งไม่ใช่ข้อยกเว้นที่เหมาะสมในการจัดการเลย
James

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

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

75
static bool GeneralRuleShouldBeFollowed(IGeneralRule rule, IUseCase useCase)
{
    return (rule.Overhead(useCase) 
            < My.PersonalThresholds.ConformismVsPracticality);
}

4
มีกฎแบบนั้นใน. NET หรือไม่? ฉันก็จะเพิ่งส่งคืนผลการแถลง : O
Joan Venge

50

บางครั้งฉันจัดกลุ่มมากกว่าหนึ่งคลาสภายในไฟล์หากมีการเชื่อมโยงกันอย่างแน่นหนาและอย่างน้อยหนึ่งคลาสมีขนาดเล็กมาก

'แนวปฏิบัติที่ดีที่สุด' ทั่วไปคือต้องมีหนึ่งไฟล์ต่อชั้นเรียน


7
หากคุณรับรู้ว่าพวกเขามีคู่ทำไมคุณไม่แยกพวกเขา?
Matt

39
@The Matt: มันเรียกว่าหลีกเลี่ยงการ overengineering หากคุณมีชั้นเรียนที่มีการเชื่อมต่ออย่างแน่นหนาและแยกชั้นพวกเขาจะเพิ่มความซับซ้อนมากขึ้นเมื่อเทียบกับจำนวนความยืดหยุ่นในการใช้งานจริงที่ให้มานั่นคือประเด็นอะไร?
dsimcha

9
บางครั้งฉันก็ชอบคลาส "data" ที่ถูกใช้โดยคลาสนี้เท่านั้นดังนั้นฉันมักจะใส่ data-class ลงในไฟล์เดียวกับผู้ใช้เพราะดาต้า - สาวมักจะไม่มีเหตุผลและไม่มีเหตุผลเลย เสียเพื่อสร้างไฟล์ใหม่สำหรับมัน
Earlz

3
@The Matt: บางครั้งก็มีชั้นเรียนผู้ช่วยที่ฉันจะเถียงว่าเป็นข้อต่อที่ยอมรับได้ พวกเขาลดความซับซ้อนสำหรับส่วนหนึ่งของชั้นเรียนอื่น แต่ยังคงช่วยให้วัตถุประสงค์ที่เฉพาะเจาะจงมากในชั้นเรียนนั้น
Jordan Parmer

6
@TheMatt: แยกสิ่งนี้: msdn.microsoft.com/en-us/library/…การ เชื่อมต่อระหว่างโมดูลนั้นไม่ดี แต่การทำงานร่วมกันระหว่างคลาสภายในคุณลักษณะแบบลอจิคัลนั้นไม่สามารถหลีกเลี่ยงได้
Ben Voigt

25

นอกเหนือจากการถกเถียงและมุ่งเน้นไปที่ Windows .NET ด้วย Visual Studio IDE และการเติบโตของโครงการซอฟต์แวร์มันมีเหตุผลในบริบทนี้ที่จะมีหนึ่งคลาสต่อไฟล์


โดยทั่วไปแล้วสำหรับการอ้างอิงแบบมองเห็นไม่มีอะไรเต้นหนึ่งคลาสต่อไฟล์ จริงๆ.

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

สำหรับคลาสที่ซ้อนกันคุณไม่มีทางเลือกนอกจากใช้ไฟล์เดียวหรืออย่างน้อยก็ส่วนแรกของคลาสในคลาสนั้น ไฟล์หนึ่งไฟล์จำเป็นและใช้ได้ในกรณีนี้:

class BicycleWheel {
    class WheelSpoke {
    }
}

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

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

เหตุผลที่ดีมากมาย ...


ขอบคุณคุณหมายถึง "อย่างน้อยส่วนแรกของพวกเขา"? คุณหมายความว่าคุณสามารถแยกคลาสที่ซ้อนกันได้หรือไม่
Joan Venge

1
นั่นคือการอ้างอิงทางอ้อมกับpartialคำหลักที่ฉันพูดถึง
John K

1
สำหรับคลาสที่ซ้อนกันในเร็กคอร์ดสามารถpartial msdn.microsoft.com/en-us/library/wa80x488(VS.80).aspx ฉันค้นหาสิ่งนี้เกินความอยากรู้
John K

นี่เป็นเพียงการแสดงว่ามุมมองเริ่มต้นควรเป็นแบบลอจิคัล (เนมสเปซ / คลาส) และไม่ใช่แบบฟิสิคัล (ไฟล์)
David Schmitt

@DavidSchmitt นั่นคือสิ่งที่ Class View ใช้สำหรับใน Visual Studio
แซค

14

ในกรณีส่วนใหญ่ฉันทำตามหนึ่งคลาสต่อกฎไฟล์ ข้อยกเว้นเดียวที่ฉันทำเป็นประจำคือคำจำกัดความของ enum ที่แนบคู่กับคลาสเฉพาะอย่างแน่นหนา ในกรณีนั้นฉันมักจะรวมคำจำกัดความของ enum ไว้ในแฟ้มของคลาสนั้น


12

ฉันก็เชื่อว่าควรมีหนึ่งประเภทรวมอยู่ในไฟล์เดียว

มีข้อยกเว้นหนึ่งข้อสำหรับกฎนี้ที่ต้องกล่าวถึง: การมีสองคลาสที่แตกต่างกันโดยอาร์กิวเมนต์ทั่วไปเช่น:

RelayCommand     

และ

RelayCommand<T>

คุณรู้วิธีแก้ปัญหาเพื่อให้ StyleCop มีความสุขในกรณีนี้หรือไม่?
George Polevoy

ไม่เห็นด้วยมีการประชุมอีกครั้งสำหรับชั้นเรียนทั่วไป Foo 1.cs for Foo <T> `และ Foo 2.cs for Foo <T, T1>`
Oybek

@Oybek: ถ้าฉันมี Foo <T>, Foo <U> และ Foo <U, T> ตอนนี้คืออะไร
Andrei Rînea

@AndreiRinea เป็นไปไม่ได้ที่จะมีFoo<T>และFoo<U>อยู่ในเนมสเปซเดียวกัน แต่ถ้าเนมสเปซต่างกันพวกเขามักอยู่ในโฟลเดอร์ต่างกัน ดังนั้นFoo<T>และFoo<U>ควรเป็น Foo 1.cs and for Foo <U, T> `Foo`2.cs แต่ก็ยังคงมีหนึ่งคลาสต่อไฟล์
Oybek

ขอบคุณสำหรับข้อมูล! :)
Andrei Rînea

8

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

นอกจากนี้สำหรับคนที่ไม่สามารถค้นหาคลาสบางคลาสได้หากพวกเขาไม่ได้อยู่ในไฟล์ที่ตั้งชื่อตามสิ่งที่พวกเขามีมีเหตุผลที่คุณไม่ใช้ค้นหาการค้นหาในโซลูชันทั้งหมดหรือไม่ การใช้การค้นหาช่วยประหยัดเวลาอันมีค่าของฉันในการเลื่อนดูโซลูชัน Explorer


Re: ค้นหา - เมื่อฉันกำลังค้นหาคำจำกัดความของประเภทฉันไม่ต้องการดูว่ามันถูกใช้ที่ไหน นอกจากนี้การค้นหาใช้เวลานานกว่าการเลื่อนดูรายการไฟล์ที่เรียงตามตัวอักษรที่ฉันอาจแบ่งแล้ว (ตามเนมสเปซ)
Jeff Sternal

1
ฉันสังเกตเห็นว่าคุณระบุว่าคุณกำลังทำงานกับบางสิ่งที่คุณแบ่งออกตามเนมสเปซ เราไม่โชคดีพอที่จะทำงานกับโครงการที่เราสามารถจัดการได้เสมอ
Jason M

6

ไม่ว่าเนื้อหาจะมีน้ำหนักเบาแค่ไหนฉันคิดว่าหนึ่งคลาส / อินเตอร์เฟส / ฯลฯ ต่อไฟล์เป็นสิ่งจำเป็น

ถ้าฉันกำลังทำงานกับโซลูชันขนาดใหญ่ใน Visual Studio ฉันต้องการให้สามารถดูไฟล์และไม่ต้องเจาะเข้าไปด้านในเพื่อดู แม้จะมีเครื่องมือนำทางเช่น ReSharper ฉันต้องการแมป 1: 1

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


5

ฉันพบว่าการจัดกลุ่มคลาสด้วยเป็นคลาสมาตรฐานจากโรงงานในไฟล์เดียวกันมีประโยชน์มาก


5

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

ดังนั้นประเด็นก็คือควรใช้ดุลยพินิจ !!!


1
ภูมิปัญญาที่แท้จริงไม่มีกฎในการเขียนโปรแกรมยากและรวดเร็ว
ChaosPandion

4

ในการแก้ปัญหาที่ใหญ่กว่าฉันคิดว่ามันมีประโยชน์มากที่จะมีหนึ่งคลาสต่อไฟล์ ทำให้ง่ายต่อการค้นหารหัสที่คุณต้องการใช้งาน


ฉันพบว่าอาร์กิวเมนต์นี้มีค่าน้อยกว่าด้วยเครื่องมือเช่น ReSharper ฉัน CTRL + T แล้วเริ่มพิมพ์ชื่อประเภทที่ฉันต้องการ
Mark

3
ใช่ แต่คุณต้องการให้โครงสร้างแอปพลิเคชันของคุณต้องอาศัยเครื่องมือของบุคคลที่สามหรือไม่
แมกนัส

1
@ แมกนัสฉันไม่ได้พูดแบบนี้ไม่ใช่เหตุผลที่จะไม่ทำ แต่การโต้เถียงที่น่าสนใจกว่าสำหรับใครบางคนที่จะทำมัน
Mark

4

เครื่องมือ StyleCop สำหรับ C # มีกฎมาตรฐานที่ไม่จำเป็นต้องมีคลาสระดับบนสุดมากกว่าหนึ่งคลาสในเนมสเปซเดียว

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


3
เมื่อคุณพูดว่า "ไม่เกินหนึ่งระดับบนสุดในหนึ่งเนมสเปซ" คุณหมายถึงในหนึ่งnamespaceบล็อกใช่ไหม
Daniel Pryden

1
กฎที่กล่าวถึงคือ SA1403: เอกสาร AC # อาจมีเนมสเปซเดียวเท่านั้น SA1402: เอกสาร AC # อาจมีคลาสเดียวที่ระดับรูตเว้นแต่ว่าคลาสทั้งหมดจะเป็นบางส่วนและเป็นประเภทเดียวกัน
Steve Gilham

4

บางครั้งหนึ่งคลาสต่อไฟล์แต่ ...

เมื่อหลายชั้นเรียนที่เกี่ยวข้อง stricly มากกว่าหนึ่งชั้นในแฟ้มแหล่งที่มาเดียวกันคือ IMHO, ดีกว่าทุ่มเทแฟ้มแหล่งที่มาสั้น ๆ ในแต่ละระดับ แหล่งข้อมูลสามารถอ่านได้และมีขนาดกะทัดรัด (และการใช้ #region แหล่งข้อมูลเดียวกันสามารถจัดโครงสร้างได้มากกว่าเดิม)

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


แน่นอนคุณควรพยายามหลีกเลี่ยงชั้นเรียนที่มีโค้ดหลายบรรทัด ฉันจะบอกว่าแม้ 1,000+ จะมีขนาดใหญ่เกินไป ฉันรู้ด้วยว่านี่เป็นไปไม่ได้ในรหัสดั้งเดิม
ปีเตอร์

ถ้าคุณพยายามที่จะสร้างซอร์สโค้ด (กรณีของฉันคือการสร้าง C # สำหรับ OpenGL จากสเปคของมันมีจุดเข้าพัน) มันยากที่จะคิดว่าคลาสเล็กน้อยสำหรับข้อมูลจำนวนมาก ...
Luca

3

ในบางครั้งฉันจะออกจากชั้นเรียนขนาดเล็กที่มีชั้นเรียนขนาดใหญ่ แต่เฉพาะในกรณีที่พวกเขามีความสัมพันธ์อย่างแน่นหนาเช่นวัตถุและเป็นชั้นเรียนคอลเลกชันหรือโรงงาน

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

กล่าวคือ

  • ในวันจันทร์ฉันทำการเปลี่ยนแปลงคลาสของฉัน x และ y ในไฟล์ y.css
  • ในวันอังคารฉันแยกคลาส x ลงในไฟล์ของตัวเอง x.css เพราะมันใหญ่ขึ้นเรื่อย ๆ
  • ในวันพุธเจ้านายของฉันต้องการเห็นสิ่งที่ฉันเปลี่ยนในชั้นเรียน x ในวันจันทร์ดังนั้นเขาจึงดูประวัติของ x.css เฉพาะ x.css เท่านั้นที่ไม่แสดงประวัติก่อนที่จะมีการเปลี่ยนแปลงในวันอังคาร

1
จะเกิดอะไรขึ้นถ้า "คลาสเล็ก" นั้นเป็นเหมือนอนุพันธ์ของ EventArgs ซึ่งมีไว้สำหรับส่งข้อมูลไปยังผู้รับของกิจกรรมในคลาสของคุณ รหัสจะถูกทำให้สะอาดหรือบำรุงรักษาง่ายขึ้นโดยการย้ายสิ่งต่าง ๆ ไปยังไฟล์อื่นหรือไม่? เนื้อหาเช่นนี้ควรเป็นชนชั้นสาธารณะที่ซ้อนกัน แต่ดูเหมือนจะขมวดคิ้วเช่นกัน สำหรับประวัติการแก้ไขคลาสจะไม่ปรากฏในที่ไหนเลยในการเปลี่ยนแปลงและไม่ควรแสดงความคิดเห็นในบันทึกย่อรหัสที่มาจากไหน
supercat

ฉันจะเรียนว่าในvery tightly relatedชั้นเรียนและปล่อยให้มันใช้เวลาเพียงเล็กน้อยของพื้นที่หน้าจอและไม่ได้ใช้เพื่อจุดประสงค์เดียวกันโดยชั้นเรียนอื่น ๆ
gingerbreadboy

3

เป็นปัญหาหรือไม่? :)
ชั้นเรียนขนาดเล็กจริง ๆ เช่นเดียวกับ enums สามารถใช้ร่วมกับผู้อื่นได้ มีกฎหนึ่งข้อที่ต้องปฏิบัติดังนี้: รวบรวมเฉพาะคลาสที่มีบางสิ่งที่เหมือนกัน

เป็นการพูดนอกเรื่อง - ในหนึ่งในโครงการของฉันฉันมีไฟล์ที่มี 150 ชั้นภายใน ไฟล์นี้มีรหัส 10,000 บรรทัด แต่มันสร้างขึ้นอัตโนมัติดังนั้นมันจึงเป็นที่ยอมรับได้อย่างสมบูรณ์ :)


1
ฉันมีไฟล์เดียวกันกับ 120 คลาสและ 750 คลาสย่อยที่มีครึ่งล้านบรรทัดมันยังสร้างอัตโนมัติปัญหาคือ: ถ้าฉันคลิกมันฉันต้องรีบูตเพราะทุกอย่างหยุด
Behrooz

3

เหตุผลหนึ่งในการใส่คลาสที่เกี่ยวข้องหลายรายการไว้ในไฟล์เดียวคือไอ้ไอ้น่าสงสารที่ใช้ API ของคุณไม่ต้องใช้เวลาครึ่งวันในการพิมพ์ประกาศประกาศสำเร็จรูปสำเร็จรูปและไอ้เลวที่ต้องรักษาโค้ดไม่ต้องเสียครึ่ง เลื่อนวันผ่านแผ่นประกาศประกาศการนำเข้า กฎง่ายๆของฉันคือว่ามีหลายคลาสที่อยู่ในไฟล์เดียวกันหากคุณมักจะใช้ชุดย่อยขนาดใหญ่ในเวลาเดียวกันแทนที่จะใช้เพียงครั้งละหนึ่งชุดเท่านั้น


1
คุณหมายถึงอะไรโดย "ประกาศแจ้งการนำเข้าสำเร็จรูป"? "ใช้คำสั่ง"? แต่คลาสจะไม่อยู่ในเนมสเปซเดียวกันหรือ
Joan Venge

3
@ Joan: ฉันหมายถึงต้องนำเข้า 15 โมดูลที่แตกต่างกัน แต่โมดูลที่เกี่ยวข้องเพื่อให้ได้สิ่งที่เรียบง่ายจริงๆ อาจใช้ไม่ได้กับ C # โดยเฉพาะ ฉันไม่รู้ C # จริงๆ แต่ในภาษาอื่นมันเป็นปัญหาที่น่ารำคาญมาก
dsimcha

ขอบคุณใช่นั่นคือเหตุผลที่ฉันสับสน
Joan Venge

2

ฉันทำสิ่งนี้ แต่เฉพาะเมื่อชั้นเรียนมีความเกี่ยวข้องในแฟชั่นผู้ปกครองเด็กและชั้นเรียนเด็กเท่านั้นที่ใช้โดยผู้ปกครอง


ขอบคุณ แต่ทำไมคุณไม่แยกมันเป็นไฟล์อื่นล่ะ แค่สงสัย.
Joan Venge

@ Henchman บอกว่ามันเยอะกว่าที่ฉันมีโดยเฉพาะอย่างยิ่งเมื่อวัตถุเด็กเล็กมาก มันเป็นเรื่องปกติในกรณีที่คลาสเด็กเป็นคุณสมบัติที่มีเพียงตรรกะเล็กน้อยเท่านั้น
CResults

2

ฉันมักจะติดกับหนึ่งคลาสต่อไฟล์ แต่ฉันจะสร้างข้อยกเว้นสำหรับกลุ่มของโครงสร้างที่คล้ายกันที่ใช้ทั้งโครงการ ตัวอย่างเช่น:

  • EventArgs.cs ที่มีEventArgsคลาสย่อยใด ๆเนื่องจากโดยปกติแล้วจะมีรหัส 5-10 บรรทัดเท่านั้น แต่โดยทั่วไปจะมีการใช้งานโดยคลาสที่แตกต่างกันหลายคลาส หรือฉันอาจใส่EventArgsคลาสในไฟล์เดียวกับคลาสที่ประกาศเหตุการณ์
  • Delegates.cs ที่มีผู้รับมอบสิทธิ์ที่ใช้ตลอดทั้งโครงการเนื่องจากโดยปกติแล้วจะมีเพียง 1 บรรทัดเท่านั้น อีกทางเลือกคือการวางไว้ในไฟล์เดียวกันกับคลาสที่ตีแผ่ / สิ้นเปลือง
  • Enums.cs ที่มีenums ที่ใช้ทั่วทั้งโครงการ (หากมีการenumใช้คลาสเพียงคลาสเดียวฉันมักจะใช้privateในคลาสนั้น)

2

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


2

ฉันทำตามมัน 99% ของเวลา เป็นเรื่องที่ดีที่จะปฏิบัติตามมาตรฐาน แต่ฉันก็เชื่อว่าความยืดหยุ่นมีอยู่ บางครั้งมันดูเหมือนว่าเป็นการเสียเวลาเปล่า ๆ ที่จะแยกสิ่งต่าง ๆ ออกจากกัน ในช่วงเวลานั้นฉันจะเอาชนะตัวเองและเขียนรหัส


2

การตอบสนองดูเหมือนจะหมุนรอบข้อยกเว้นของผู้คนต่อกฎดังนั้นนี่คือของฉัน: ฉันเก็บคลาสและคลาส 'เพื่อน' เมตาดาต้าของพวกเขาร่วมกันเมื่อใช้แพ็คเกจ DataAnnotations ใน. NET3.5 SP1 ไม่เช่นนั้นจะอยู่ในไฟล์แยกกันเสมอ คุณรู้ว่าส่วนใหญ่เวลา ยกเว้นเมื่อไม่ได้


2

ฉันทำสิ่งนี้ไม่ค่อยบ่อย ตัวอย่างเช่นหากมีการแจงนับหรือโครงสร้างที่เกี่ยวข้องอย่างใกล้ชิดกับชั้นเรียน แต่เล็กน้อยเกินไปที่จะแยกออกจากกันด้วยตัวเอง

หรือคลาสที่แยกต่างหากเพื่อให้มีวิธีการขยายสำหรับคลาสหลักนั้น


1

One case could be:เมื่อชั้นเรียนของคุณร่วมกันในรูปแบบmodule / unitที่ให้บริการชั้นหลักบางอย่างเช่นhelper classesฉลาดอื่น ๆไม่มี

ดูที่ซอร์สโค้ดโครงการASP.NET MVC 2.0 มันปฏิบัติตามกฎนี้อย่างเคร่งครัด


1

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

ฉันจะไม่ทำตามแนวทางปฏิบัติของ MS เนื่องจากไม่ใช่แนวปฏิบัติที่ดีที่สุด!


1

อีกจุดหนึ่งที่ฉันไม่เคยเห็นใครพูดถึงคือเมื่อคุณพัฒนาโดยใช้หนึ่งคลาสต่อกฎไฟล์คุณสามารถเห็นได้ว่าคลาสใดที่เฉพาะเจาะจงใช้อยู่

ตัวอย่างเช่น: คุณอาจมีสองคลาสโดยที่หนึ่งคลาสใช้ Linq และอีกคลาสหนึ่งไม่มี

หากคลาสเหล่านี้อยู่ในไฟล์เดียวกันคุณจะไม่สามารถบอกได้โดยไม่ต้องดูรหัสซึ่งคลาสใช้อะไร เมื่อมันเป็นหนึ่งคลาสต่อไฟล์ทั้งหมดที่คุณต้องทำคือดูที่ด้านบนของไฟล์เพื่อดูว่ามีการใช้งานอะไรในคลาสนั้น ช่วยหากคุณเคยย้ายไปที่ lib ใหม่ ฯลฯ


0

อีกเหตุผลหนึ่งสำหรับหนึ่งไฟล์ต่อหนึ่งไฟล์ที่ไม่ได้กล่าวถึงในคำตอบที่โพสต์นั้นคือหนึ่งไฟล์ต่อหนึ่งไฟล์ทำให้ง่ายต่อการเข้าใจผลกระทบของ PR ในระหว่างการตรวจสอบรหัส นอกจากนี้ยังลดความขัดแย้งในการผสาน

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

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

มีข้อยกเว้นสำหรับกฎนี้ (อินเตอร์เฟส + การนำไปใช้งาน, enums, ... ) แต่มันเป็นจุดเริ่มต้นที่ดีกว่าตรงกันข้ามซึ่งโดยทั่วไปแล้วจะช่วยให้นักพัฒนารุ่นเยาว์สามารถรวมคลาสที่ไม่เกี่ยวข้องทั้งหมดไว้ในไฟล์เดียวกันได้

One-class-per-file เป็นกฎที่ชัดเจนไม่ต้องตีความ


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


-1

กลับไปกลับมาน่าสนใจมากและสรุปไม่ได้แม้ว่าความประทับใจโดยทั่วไปของฉันคือการทำแผนที่ 1-1 ระหว่างคลาสและไฟล์เป็นความเห็นส่วนใหญ่แม้ว่าจะมีข้อยกเว้นแบบบุคคลต่อบุคคล

ฉันอยากรู้ว่าคำตอบใดของคุณแตกต่างกันไปขึ้นอยู่กับว่าคุณเป็น: (1) พัฒนาแอพ Windows Forms, เว็บแอป, ห้องสมุดหรืออะไรก็ตาม; หรือ (2) ใช้ Visual Studio หรือไม่ ในการใช้ VS จะปรากฏว่าหนึ่งคลาสต่อกฎไฟล์จะมีความหมายหนึ่งคลาสต่อโครงการ VS เนื่องจากข้อสรุปในเธรดอื่นดูเหมือนว่าโซลูชัน VS / โครงการควรถูกมิร์เรอร์ในการตั้งชื่อไดเร็กทอรี / โครงสร้างไฟล์ อันที่จริงแล้วการแสดงผลของฉันคือการแสดงความเห็นร่วมที่จะมีชื่อโปรเจ็กต์ = แอสเซมบลีชื่อ = (ซ้อน) ชื่อเนมสเปซซึ่งทั้งหมดนี้จะถูกมิร์เรอร์ในการตั้งชื่อไดเรกทอรี / ไฟล์และโครงสร้าง หากสิ่งเหล่านั้นเป็นแนวทางที่ถูกต้อง (หรือกฎ) กลไกการจัดระเบียบแบบออโธกอนอลดูเหมือนจะยังคงถูกซิงค์อยู่


-1

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


-5

รายการรหัสหนึ่งรายการต่อไฟล์ใช่

ทุกสิ่งทุกอย่างคือการทุจริตต่อหน้าที่และเป็นสัญญาณบ่งบอกถึงความเป็นเหยื่อของ RAD

ทันทีที่เริ่มการพัฒนาซอฟต์แวร์ที่เหมาะสม (IoC, รูปแบบการออกแบบ, DDD, TDD, ฯลฯ ... ) และออกจาก "omg ให้ทำสิ่งนี้ได้ฉันไม่รู้เลยว่า แต่ฉันได้รับเงิน" สนามเด็กเล่นใครจะเห็นว่า กฎนี้มีความสำคัญจริงๆ

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