Aynı ada sahip genel sınıflar içeren dosyaları yapılandırmanın ve adlandırmanın en iyi yolu nedir?


14

Şu anki projemde aynı isimde, ancak farklı sayıda jenerik parametreye sahip jenerik sınıflar yaratma gereksinimi ile karşılaştım. Örneğin:

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

Tüm bunları aynı isim alanında istediğim göz önüne alındığında, sınıflarımı ve dosyalarımı nasıl yapılandıracağım ve adlandıracağım konusunda kafam karıştı?

Sınıflar dosya başına bir tane ile sınırlı olması ve dosyaların ad alanı hiyerarşisini temsil eden bir klasör yapısında olması ve dosyanın adının sınıfın adıyla eşleşmesi gerektiği fikrini takip edersek, bu durumla nasıl başa çıkabilirim? ?

Ne Gerçekten burada soruyorum ben isim gereken budur dosyayı içeren MyClass<T1>, ve neye isimlendirmeliyim dosyasını içerir MyClass<T1, T2>? Tür parametrelerinin adlarının ne olması gerektiğini sormuyorum.


Sorunu daha ayrıntılı açıklayan bazı özel örnekler verin . Verdiğiniz örnekler de ... erm, genel. "Sınıflarımı ve dosyalarımı nasıl yapılandırabilir ve adlandırırım?"
Robert Harvey

Microsoft bunu yalnızca type parametresine bir sayı ekleyerek yapar. Tuple belgelerine bakın
Pete

@Pete: Bu gerçekten sadece Tuple için geçerlidir. Microsoft ayrıca TKey, TValuesözleşmeyi kullanır . Func'un bir TResulttür parametresi vardır. Gerçi T1, ve T2gibi belirli kullanımları olmayan değişken sayıda giriş parametresi için, vb . TKeyTValue
Robert Harvey

@RobertHarvey Evet, ancak yalnızca sözlük gibi gerçek bir anahtar / değer koleksiyonu bağlamında. Değişken sayıda tipten oluşan herhangi bir şey için bir sayı eklerler. İşte başka bir örnek: msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
Pete

1
Düzenlemeleriniz bazı yorumları geçersiz kılıyor. :) Neden sınıfları aynı fiziksel dosyada tutamıyorsunuz? Onları ayrı dosyalarda tutmanız gerekecek kadar farklıysa, onları neyin farklı kıldığını söyleyebilir misiniz?
Pete

Yanıtlar:


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

Ve böylece, backtick'ten sonraki sayı, genel tip parametrelerinin sayısıdır. Bu kural Microsoft tarafından kullanılır.

Alternatif olarak,

MyGenericCollectionClass[TKey, TValue].cs

yalnızca genel tür parametrelerinin sayısını değil, aynı zamanda belirli adlarını da korur. Elbette, köşeli parantezleri korumaz, ama hayatta istediğimiz her şeye sahip olamayız, değil mi?


1
Derleyici, genel türlerin adını dahili olarak yönetir, bir backtick ve genel parametre sayısı ekler, çünkü .NET, farklı sayıda genel parametreye sahip aynı ada sahip birden çok türe izin vermez, ancak C # yapar. Böylece dosya adlandırma kuralı derleyicinin yaptığı ile eşleşir.
CodesInChaos

1
Sana yanlış olduğunu kanıtlamak istedim, ama haklısın : github.com/dotnet/corefx/tree/master/src/… Bu sözleşmeyi sevmiyorum.
Den

1
@Den, şimdi bu sözleşmeden pişman oldukları anlaşılıyor. Belki bazı problemleri ima etti? github.com/dotnet/corefx/commit/…
Sam

@Sam Umarım, Microsoft ekipleri arasında bir iletişim sorunu yoktur. Çünkü bunu kimse yapmıyor. Ayrıca derleme ekibi için değil, bence kütüphane ekibi değil.
Den

Bir dosya adında "` "kullanmak için toplara sahip olmazdım.
Cristian E.

4

Pete'nin bahsettiği durumda Tupleve ActionMicrosoft'un kendisi tek bir dosya kullanıyor - bkz. Tuple.cs ve Action.cs .

Kısmen tüm sınıfların işlevselliğinin temelde aynı olup olmadığına bağlı olduğunu düşünüyorum. Şahsen sınıfları tek bir dosyaya atlamayı sevmiyorum, ama bu bir istisna olabilir. Çalıştığım kaynak kodunda, yapıcıya ilk argüman olarak bir dize adı ile NamedTupleaynı şekilde hareket eden bir otomatik oluşturulmuş (T4 kullanarak) sınıf ekledim Tuple.

Sorunuzu cevaplamak için, tek bir dosya kullanmak istemiyorsanız, belki de MyClass_1.cs for MyClass<T1>, MyClass_2.cs for MyClass<T1, T2>vb.

Her iki seçenek de idealdir, bu yüzden "Microsoft bu şekilde yap, bu yüzden ..." argümanını önermeye meyilli olurum.


2
Tupleve Actionhepsi delege; herhangi bir uygulama kodu yoktur, bu nedenle tüm varyasyonları ayrı dosyalara koymak zaten anlamsız olacaktır. Her kuralın bir istisnası olduğunu kanıtlar.
Robert Harvey

Evet, genel olarak konuşursak, aynı dosyaya birden fazla kamu delegesi koymak (ilgili oldukları sürece) iyi kabul edilir.
Stephen

1
@RobertHarvey, Tuplebir temsilci değildir, ancak her uygulama zaten kısadır.
Arturo Torres Sánchez

@ ArturoTorresSánchez: Doğru, düşünüyordum Func.
Robert Harvey

0

Kendinize, sınıfların gerçekten aynı amaca sahip olup olmadığını sordunuz mu? Bir sınıf diğerinden daha genelse , GenericClass , MoreGenericClass ve MostGenericClass olur . Bir sınıfın her type parametresinin sınıfa yeni bir boyut eklediğini düşünün, bu nedenle sınıfın hangi boyutta olduğunu sormaya yardımcı olabilir.

Bu örneği ele alalım:

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

Bunun en iyi örnek olmadığının, ancak üç boyutu göstermenin çok etkileyici olduğunun farkındayım:

  • iç Boyut, ne yükleyebilir
  • metrik Metrikin yüklenebileceği boyut, yalnızca şey sayısı veya kare ölçü veya küp kapasitesi veya ağırlık olarak
  • yüklenebileceği dış Boyut.

Böylece araba taşımacılığını modelleyebilirsiniz:

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

Sıvıların taşınması:

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

Enerji taşımacılığı:

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

Şeker, tahıl nakliyesi:

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

Oh, ne sürpriz: a List<T>listenin tutabileceği şeyleri temsil eden bir boyutu var; ve bu, Map<T, S>haritanın tutabileceği şeyleri ve erişim tuşlarını temsil eden iki boyutlu bir a .


1
Soruyu anladığınızı sanmıyorum. Sorunun son paragrafına bakın.
Robert Harvey

1
@RobertHarvey Lütfen soruyu dikkatlice okuyun: sınıf adı dosya adına uygun olmalıdır. Değiştirilebilir. Sorun, sınıfın yanlış analizinde ve genel olarak genel sınıfların yanlış adlandırılmasında yatmaktadır. Cevabımı özetlemek gerekirse: "Göründüğü gibi değil, ne olduğunu adlandırın."
shylynx


1
@RobertHarvey Cevabımı oku: Bir sınıfı bir dosyaya koy!
shylynx

1
Bence bu noktayı kaçırıyorsun. Soru sorar: Nasıl koyacağım Tuple<T1>, Tuple<T1, T2>ve Tuple<T1, T2, T3>standart bir şekilde ayrı CS dosyalar halinde adı çatışmalar olmadan?
Robert Harvey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.