หลายคลาสในไฟล์. cs เดียว - ดีหรือไม่ดี [ปิด]


30

ขอแนะนำให้สร้างหลายคลาสภายในไฟล์. cs หรือควรแต่ละไฟล์. cs มีคลาสแยกต่างหาก

ตัวอย่างเช่น:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

หลบข้อเท็จจริงที่ว่านี่เป็นตัวอย่างที่ดีของสถาปัตยกรรมที่ดีมีมากกว่าหนึ่งคลาสในไฟล์. cs ที่มีกลิ่นรหัสหรือไม่

คำตอบ:


30

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

  • คุณกำลังออกแบบกลุ่มคลาส (พบมากในวัตถุประสงค์ -c) ดังนั้นจึงอาจมีเหตุผลที่จะใช้วิธีคลาสบางส่วน
  • คุณต้องการ enum ที่ใช้กับพับลิก API ของคลาสพาเรนต์เท่านั้น ในกรณีนี้ฉันต้องการให้มีการประกาศ enum สาธารณะในชั้นผู้ปกครองแทนที่จะทำให้เนมสเปซสกปรก Enum ที่เป็น "Inner enum" จะให้ผลลัพธ์ในขอบเขตที่กำหนดไว้อย่างดี

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

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

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

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


1
ฉันเห็นด้วย แต่จากนั้นชั้นในอีกครั้งเป็นเรื่องแปลกมากในประสบการณ์ของฉัน เพื่อความเป็นธรรมนั้นไม่ได้มีอะไรมากมายที่สามารถพิสูจน์ความเป็นคลาสภายในได้กรณีเดียวที่ฉันรู้คือคลาส IEnumerable ที่คุณไม่ได้เกี่ยวกับคลาสที่แท้จริงตราบใดที่คุณสามารถระบุได้ ในกรณีอื่น ๆ แต่ละคลาสควรได้รับเป็นไฟล์ของตัวเอง หากไม่มีเหตุผลอื่นเพราะปัญหาการควบคุมแหล่งที่มา
Homde

2
ฉันจะเพิ่มว่าคลาสภายในควรเป็นข้อยกเว้นที่หายากและแทบจะไม่ควรเป็นแบบสาธารณะ
Josh

Yup สอนให้ฉันทำตัวออกอย่างรวดเร็วชั้นในก็โอเค แต่การถามว่าคุณควรใช้ innerclasses เป็นคำถามอื่น :)
krystan honor

11

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

หากมีคลาสที่เกี่ยวข้องอย่างใกล้ชิดให้ตั้งชื่อไฟล์ของพวกเขาในลักษณะเดียวกันหรือวางไว้ในโฟลเดอร์ย่อย

การแยกทางกายภาพของไฟล์คลาสช่วย (หมายเหตุไม่ใช่การสิ้นสุดทั้งหมด) การแยกความกังวลและการเชื่อมต่อที่หลวมมากขึ้น

ในทางตรงกันข้ามตัวอย่างของคุณไม่แสดงคลาสรูทมากกว่าหนึ่งคลาส มีหลายคลาสที่ซ้อนกันอยู่ (หมายเหตุ: พยายามที่จะไม่สร้างคลาสที่ซ้อนกัน แต่privateถ้าคุณสามารถออกแบบได้) และนี่เป็นสิ่งที่สมบูรณ์แบบที่จะมีในไฟล์เดียว


3
โอ้พระเจ้า - นั่นฟังดูแย่มาก

ทำไมคุณถาม มีคนลงคะแนนคุณและคุณต้องการถามว่าทำไม

เดี๋ยวก่อน ... เจ้าหมายถึงเรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับงานล่าสุดของฉันหรือไม่? ถ้าเป็นเช่นนั้นฉันเข้าใจผิดและขอโทษที่ทำเช่นนั้น
Jesse C. Slicer

เห็นด้วยอย่างสมบูรณ์ ฉันกำลังทำงานในโครงการที่ไฟล์ส่วนใหญ่มีอย่างน้อย 4 คลาสต่อไฟล์ และบางอันมีมากถึง 22 คลาส + 1 อินเตอร์เฟสต่อไฟล์
L_7337

7

หากไฟล์มีความเหนียวแน่นสูงเช่นเป็นทางเลือกแทนการมีไฟล์ที่สั้นและมีชื่อคล้ายกันหลายไฟล์ก็เป็นความคิดที่ดี

ตัวอย่างเช่นฉันพบว่าเมื่อใช้ Fluent NHibernate ง่ายขึ้นถ้าฉันเก็บไว้EntityและEntityMapในไฟล์เดียวแม้ว่าเครื่องมือของฉันอาจจะพูดเกี่ยวกับเรื่องนั้นก็ตาม

ในกรณีส่วนใหญ่มันทำให้ชั้นเรียนยากขึ้น ใช้เท่าที่จำเป็นและด้วยความระมัดระวัง


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

7

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

แน่นอนว่าคุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการใช้ฟีเจอร์ในเครื่องมือเช่น resharper เพื่อข้ามไปยังประเภท แต่ 1 คลาสต่อไฟล์ (รวมถึงอินเตอร์เฟส) นั้นเป็นกระดูกสันหลังของมาตรฐานรหัสใด ๆ ที่ฉันเคยเห็นไม่ใช่แค่ใน. net แต่ใน java และ c ++ และภาษาอื่น ๆ อีกมากมายภาษาที่ไม่มีปัญหาด้านการบำรุงรักษาบ่อยและคุณจะพบรุ่นจูเนียร์ devs พบว่ามันยากที่จะเข้าใจโค้ด

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


3

อีกประเด็นคือคลาสที่ใหญ่และคล้ายกันในไฟล์เดียวกัน - เมื่อคุณไม่เห็นการประกาศคลาสตลอดเวลา - คุณอาจวางเบรกพอยต์ในคลาสที่ไม่ถูกต้องและสงสัยว่าทำไมพวกเขาถึงไม่โดน ... ฮึ่ม! :)


-3

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

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