วิธีที่ดีที่สุดในการจัดโครงสร้างและชื่อไฟล์ที่มีคลาสทั่วไปที่มีชื่อเดียวกันคืออะไร?


14

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

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

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

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

สิ่งที่ฉันถามจริงๆนี่คือสิ่งที่ฉันควรตั้งชื่อไฟล์ที่มีMyClass<T1>และสิ่งที่ฉันควรตั้งชื่อไฟล์ที่มีMyClass<T1, T2>? ฉันไม่ได้ถามว่าชื่อของพารามิเตอร์ประเภทควรเป็นอะไร


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

Microsoft ทำสิ่งนี้เองโดยเพียงต่อท้ายตัวเลขกับพารามิเตอร์ type ดูเอกสาร Tuple: msdn.microsoft.com/en-us/library/…
Pete

@Pete: นั่นใช้ได้กับ Tuple เท่านั้น Microsoft ยังใช้การTKey, TValueประชุม Func มีTResultพารามิเตอร์ประเภท แต่ผมไม่เห็นด้วยที่คุณสามารถใช้T1, T2ฯลฯ สำหรับจำนวนตัวแปรของพารามิเตอร์การป้อนข้อมูลที่ไม่ได้มิฉะนั้นจะมีการใช้ที่เฉพาะเจาะจงเช่นและTKey TValue
Robert Harvey

@RobertHarvey ดีใช่ แต่เฉพาะในบริบทของคอลเลกชันคีย์ / ค่าที่แท้จริงเช่นพจนานุกรม สำหรับสิ่งใด ๆ ที่ประกอบด้วยประเภทตัวแปรจำนวนหนึ่งพวกเขาจะผนวกหมายเลข นี่คืออีกตัวอย่าง: msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
Pete

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

คำตอบ:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

และอื่น ๆ โดยที่หมายเลขหลัง backtick คือจำนวนพารามิเตอร์ประเภททั่วไป ข้อตกลงนี้ใช้โดย Microsoft

หรือคุณสามารถใช้สิ่งที่ชอบ

MyGenericCollectionClass[TKey, TValue].cs

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


1
คอมไพเลอร์จะทำให้ชื่อของประเภททั่วไปภายในเพิ่ม backtick และจำนวนพารามิเตอร์ทั่วไปเนื่องจาก. NET ไม่อนุญาตให้มีหลายประเภทที่มีชื่อเดียวกันกับหมายเลขทั่วไปของพารามิเตอร์ทั่วไป แต่ C # ทำ หลักการตั้งชื่อไฟล์จึงตรงกับสิ่งที่คอมไพเลอร์ทำ
CodesInChaos

1
ฉันต้องการพิสูจน์ว่าคุณผิด แต่จริงๆแล้วคุณถูกต้อง: github.com/dotnet/corefx/tree/master/src/ … ฉันไม่ชอบการประชุมนี้
Den

1
@ Den ดูเหมือนว่าตอนนี้พวกเขาจะเสียใจจากการประชุม บางทีมันอาจส่อถึงปัญหาบางอย่าง? github.com/dotnet/corefx/commit/...
แซม

@ Sam หวังว่าไม่ใช่ปัญหาการสื่อสารระหว่างทีม Microsoft เพราะไม่มีใครทำ นอกจากนี้ยังขึ้นอยู่กับทีมคอมไพเลอร์ไม่ใช่ทีมห้องสมุดในการตัดสินใจในความคิดของฉัน
Den

ฉันไม่มีลูกบอลสำหรับใช้ "` "ในชื่อไฟล์
Cristian E.

4

ในกรณีของTupleและActionที่พีทได้กล่าวถึงไมโครซอฟท์ตัวเองใช้ไฟล์เดียว - ดูTuple.csและAction.cs

ฉันคิดว่ามันขึ้นอยู่กับว่าฟังก์ชั่นการเรียนทั้งหมดนั้นเหมือนกันหรือไม่ โดยส่วนตัวแล้วฉันไม่ชอบคลาส lumping ในไฟล์เดียว แต่นี่อาจเป็นข้อยกเว้น ในซอร์สโค้ดที่ฉันทำงานฉันเพิ่มNamedTupleคลาสautogenerated (โดยใช้ T4) ซึ่งทำหน้าที่ในลักษณะเดียวTupleกับ แต่มีชื่อสตริงเป็นอาร์กิวเมนต์แรกในตัวสร้าง

หากต้องการตอบคำถามของคุณหากคุณไม่ต้องการใช้ไฟล์เดียวอาจใช้ MyClass_1.cs สำหรับMyClass<T1>, MyClass_2.cs สำหรับMyClass<T1, T2>เป็นต้น

ตัวเลือกทั้งสองไม่เหมาะอย่างยิ่งดังนั้นฉันจึงอยากแนะนำอาร์กิวเมนต์ "Microsoft ทำอย่างนี้ดังนั้น ... "


2
TupleและActionเป็นตัวแทนทั้งหมด พวกเขาไม่มีรหัสการนำไปใช้ดังนั้นการวางรูปแบบทั้งหมดในไฟล์แยกต่างหากจะไม่มีประโยชน์อะไรเลย เพียงพิสูจน์ว่าทุกกฎมีข้อยกเว้น
Robert Harvey

ใช่โดยทั่วไปการพูดให้ผู้เข้าร่วมสาธารณะหลายคนลงในไฟล์เดียวกันถือว่าโอเค (หากพวกเขาเกี่ยวข้องกัน)
Stephen

1
@RobertHarvey Tupleไม่ใช่ผู้รับมอบสิทธิ์ แต่การใช้งานแต่ละครั้งนั้นสั้น
Arturo Torres Sánchez

@ ArturoTorresSánchez: Funcใช่ฉันคิดของ
Robert Harvey

0

คุณเคยถามตัวเองไหมว่าชั้นเรียนมีจุดประสงค์เดียวกันหรือไม่? หากหนึ่งในชั้นเรียนทั่วไปมากขึ้นกว่าที่อื่น ๆ แล้วมันจะเป็นGenericClassเป็นMoreGenericClassและMostGenericClass ลองจินตนาการว่าพารามิเตอร์แต่ละประเภทของคลาสเพิ่มมิติใหม่ให้กับคลาสดังนั้นจึงอาจช่วยถามได้ว่าเป็นมิติข้อมูลใด

ให้นำตัวอย่างนี้:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

ฉันรู้ว่ามันไม่ใช่ตัวอย่างที่ดีที่สุด แต่แสดงออกได้ดีมากที่แสดงสามมิติ:

  • สิ่งที่สามารถโหลดได้
  • Dimension Dimension ซึ่งสามารถโหลดเมตริกได้โดยนับสิ่งต่างๆหรือตามหน่วยสี่เหลี่ยมหรือความจุแบบลูกบาศก์หรือโดยน้ำหนัก
  • ขนาดภายนอกซึ่งสามารถโหลดได้

ดังนั้นคุณสามารถจำลองการขนส่งรถยนต์:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

การขนส่งของเหลว:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

การขนส่งพลังงาน:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

การขนส่งน้ำตาลธัญพืช:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

โอ้ช่างน่าประหลาดใจ: a List<T>มีมิติเดียวที่แสดงถึงสิ่งที่รายการสามารถเก็บไว้ได้ และนี่คือส่วนMap<T, S>สองมิติที่แสดงถึงสิ่งที่แผนที่สามารถเก็บและคีย์การเข้าถึง


1
ฉันไม่คิดว่าคุณเข้าใจคำถาม ดูย่อหน้าสุดท้ายของคำถาม
Robert Harvey

1
@RobertHarvey โปรดอ่านคำถามอย่างระมัดระวัง: ชื่อคลาสควรเป็นชื่อไฟล์ aquivalent มันสลับกันได้ ปัญหาอยู่ที่การวิเคราะห์คลาสอย่างไม่ถูกต้องและการตั้งชื่อคลาสทั่วไปไม่ถูกต้อง เพื่อสรุปคำตอบของฉัน: "ตั้งชื่อว่ามันคืออะไรและไม่ใช่สิ่งที่มันเป็น"
shylynx


1
@RobertHarvey อ่านคำตอบของฉัน: ใส่หนึ่งคลาสเป็นหนึ่งไฟล์!
shylynx

1
ฉันคิดว่าคุณไม่มีจุด คำถามที่ถาม: ฉันจะวางวิธีTuple<T1>, Tuple<T1, T2>และTuple<T1, T2, T3>เป็นไฟล์ CS แยกจากกันในวิธีการมาตรฐานโดยไม่มีการปะทะกันชื่อ?
Robert Harvey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.