C # ad alanı ve kütüphaneler için sınıf adlandırma kuralı


26

C # dilinde çeşitli küçük yardımcı program işlevlerine sahip kütüphaneler kuruyorum ve bir ad alanına ve sınıf adlandırma kuralına karar vermeye çalışıyorum. Mevcut organizasyonum şöyle:

Company
Company.TextUtils
    public class TextUtils {...}
Company.MathsUtils
    public class MathsUtils {...}
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SIUnits
    public enum SISuffixes {...}
    public class SIUnits {...}

Bu, ad alanını ve sınıfları düzenlemek için iyi bir yol mu, yoksa daha iyi bir yol var mı? Özellikle ad alanında ve adında aynı ada sahip olmak gibi görünüyor (örneğin, Company.TextUtilsad alanı ve TextUtilssınıf) sadece çoğaltmadır ve şemanın daha iyi olabileceğini düşündürmektedir.



5
Microsoft yönergeleri, enums SISuffixyerine tekil adlar önerir (bunun yerine SISuffixes) ve tekillerin daha iyi okuduğunu düşünüyorum. "A eki" Suffix.A olarak okur . Ayrıca, genellikle hiyerarşideki bir seviyedeki adları tekrarlamaktan kaçınırım. Bu, onun yerine, Company.SIUnits.SISuffixesyaslanacağım Company.SI.SuffixveCompany.SI.Unit
Harrison Paine

Yanıtlar:


9

Adlandırma stratejinizin ne kadar etkili olduğunu kodunuzun geri kalanından ayrı tutmak zordur.

Ad alanı, kod tabanınızın geniş yapısına nerede uyduğu konusunda bir fikir vermelidir ve sınıf adı genellikle, bu alanda ne tür işlevsellik veya kavramı temsil ettiğini açıklar.

Belirli bir örnekte, çok daha fazla 'Util' tipi sınıfınız varsa, onları Company.Utils.Mathsvb. Altına almayı düşünebilirsiniz . Bu şekilde, birden fazla kullanım alanına ortak olan işlevler eklemeniz gerekiyorsa, zaten bunun için doğal bir yer.


1
Güzel bir fikre benziyor. Endişelenmeyi bırak, hepsini "Company.Util" e kopyala.
kullanıcı

30

Microsoft: Framework Tasarım Kuralları'na uymak için izlemeniz gereken birçok kural içeren hoş bir belge var .

Değiştirmek gerektiğini bir şey var: Do not kendi ad olarak sınıflarını adlandırın. Bu derleyici karışımlarına yol açacaktır. Sadece yapma Her iki isim alanı sınıfı için daha iyi bir isim bulun.


3
Ad

1
Tesadüfen olsun veya olmasın, konu hakkında harika bir kitabın adı aynı, aynı zamanda DotNet çerçevesinin oluşturulmasına katılan Microsoft'un yazdıkları, doğru yaptıkları ve nerede yanlış yaptıkları hakkında birkaç yorumla yazılmış. Okunmaya
Machado

@nvoigt, cevabınızı arkadaşımız Pagotti'nin sağladığı linkten bir alıntı eklemek için lütfen cevabınızı düzenler misiniz: " Bir isim alanı için aynı adı ve bu isim alanındaki bir yazıyı KULLANMAYIN . Örneğin, Debug'u bir isim alanı adı olarak kullanmayın ve Daha sonra aynı ad alanında Debug adında bir sınıf da sağlayın. Birkaç derleyici bu türlerin tam olarak nitelendirilmesini gerektirir. "
Machado

2
Uyarı: Bazen bir Ürün adı bir Şirket adı kullanmaktan daha iyidir. Bir şirketin satın alındığı birkaç senaryoda bulunduk ve yönetim kurulunda yeni ad alanları üretmek ve yeniden piyasaya sürmek zorunda kaldık. Bence bu çok küçük ama işaret etmek istedi.
Jon Raynor

1
Microsoft'un çerçeve tasarım kuralları oldukça tartışmalı, .NET'in nasıl çalıştığı hakkında yanlış ifadeler içeriyor ve çoğu zaman Microsoft tarafından takip edilmiyor. Adlandırma kuralları iyi, ancak genel kuralları "takip etmelisiniz" ifadesiyle ilişkilendirmekten kaçınırdım.
Carl Leth

6

C # veya .NET ekosistemi ile çalıştığımdan beri bir süre geçti, o yüzden şu an önerilen en iyi uygulamaların ne olduğunu söyleyemem. İsimlerinizde böyle bir değişiklik yapmanızı tavsiye ederim:

Company
Company.Text
    public class TextUtils {...}
Company.Math
    public class MathUtils {...}
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SI
    public enum SISuffixes {...}
    public class SIUnits {...}

Burada yaptığım şey, isim alanı adlarından "Utils" i kaldırmak. Bence "Util" bir isim alanında olmamalıdır, çünkü Company.Textisim alanı bir gün metin programı dersleri olmayan sınıflar içerebilir . Company.MathAd zaten içeriyor ArbitraryPrecisionNumber, bir "yarar" olarak gözükmüyor hangi.

"Util" i ad alanından kaldırmak aynı adı taşıyan iki şeyden kaynaklanabilecek karışıklığı da giderir (Robert'ın cevabında belirtildiği gibi: /software//a/340440/13156 )

Kodu düzenlemenin bir başka yolu:

Company
Company.Util
    public class TextUtils {...}
    public class MathUtils {...}
Company.Math
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SI
    public enum SISuffixes {...}
    public class SIUnits {...}

Bu durumda, yardımcı sınıfların tümü aynı ad alanında bulunur. Company.TextYardımcı sınıf olduğu için tek isim alanı yok .

Şahsen ilk seçeneği biraz daha net buluyorum.


4

Ad alanı ve içindeki sınıf için aynı adı kullanmak sorunludur.

  • Ad alanı birden fazla sınıf içeriyorsa, neden diğer sınıflar oraya konsun? doğru hissetmiyor, çünkü ad alanının isminin amacı sadece içindeki değil, içindeki tüm sınıfları tanımlamak . Örneğin, bir ad alanında ve sınıflarınız varsa JsonSerialization, ad alanınızı adlandırmak mantıklı olur mu?BinarySerializationXmlSerializationXmlSerialization

    Genelde olan şey, bir sınıfın varolan bir ad alanından çıkarılması veya birden çok sınıf veya başka bir yeniden yapılanma arasında bir birleşme nedeniyle, kendinizi büyük bir sınıf içeren bir ad alanıyla bulmanızdır ; aşamalı olarak, küçük sınıflar oraya yerleştirilir çünkü orjinal sınıfla biraz ilişkilidir. Örneğin, bir ad LogParser, tek bir sınıf içerebilir LogParserve sonra birileri koyar LogConverteroldukça, daha sonra ayrıştırıcı alakalı çünkü LogSearchervb Buradaki sorun ad alanının adı değiştirilmedi şudur: yakında kadar LogConvertereklenmiş, adın, LogsProcessingveya olarak değiştirilmeliydi Logs.

  • Ad alanı yalnızca bir sınıf içeriyorsa , kod organizasyonu içindeki bir sorunun işareti olabilir .

    Birkaç kez, uygun SOLID ilkelerine sahip tek bir sınıfın, kod tabanındaki herhangi bir şeyden çok farklı olduğu ve dolayısıyla özel bir ad alanına yerleştirildiği durumları görmeme rağmen, bu tür durumlar nadirdir. Daha sık olarak, bu bir sorunun göstergesidir. Benzer şekilde, hiçbir şey tek bir yöntem içeren bir sınıfa sahip olmanızı engellemez, ancak çoğu zaman bu tür sınıflar bir sorunu işaret eder.

    Ad alanınız yalnızca bir sınıf içeriyor olsa bile, genellikle sınıfı adlandırırken daha belirgin olmanın ve ad alanını adlandırırken daha genel olmanın bir yolu vardır. Belirli bir anda, ABC biçiminde yazılmış dosyaları DEF biçimine dönüştürmesi gereken bir uygulamayı düşünün. Dönüşüm, işletme nesnelerine / işlerinden seri hale getirme / serileştirme gerektirmez ve dönüşüm sınıfının içine konacak kadar kısa olan bir sürü normal ifade uygulayarak yapılır.AbcToDefConverter. Tüm dönüşüm mantığı, yaklaşık on birbirine bağlı yöntemde yaklaşık 80 LLOC alır - var olan sınıfı ayırmaya veya ek sınıflar yaratmaya kesinlikle gerek olmayan bir durum gibi görünüyor. Uygulamanın kalan kısmının dönüşümlerle hiçbir ilgisi olmadığı için, sınıf mevcut ad alanlarında diğer sınıflarla gruplandırılamaz. Böylece biri denilen bir ad alanı yaratır AbcToDefConverter. İçinde yanlış olan hiçbir şey olmamasına rağmen, kişi gibi daha genel bir ad da kullanabilirdi Converters. Python gibi dillerde daha kısa isimlerin tercih edildiği ve tekrarlamanın üzerine atıldığı dillerde bile olabilir converters.Abc_To_Def.

Bu nedenle, ad alanları için içerdikleri sınıflardan farklı adlar kullanın. Bir sınıfın adı, sınıfın ne yaptığını belirtmek zorunda iken, ad alanının adı, içine konulan tüm sınıflarda ortak olanı vurgulamalıdır.


Bu arada, faydalı sınıflar doğası gereği yanlıştır: isteğe bağlı kesin aritmetik gibi belirli bir şey eklemek yerine , diğer sınıflarda yolunu bulamayan her şeyi içerir . Bu, sadece Miscellaneousmasaüstünde bir dizin olarak, organizasyon eksikliğinin göstergesi olan bir şey olarak, kötü adlandırmadır .

Adlandırma bir sebepten dolayı vardır: daha sonra bir şeyler bulmanız gerektiğinde hayatınızı kolaylaştırmak için. Bir grafik çizmeniz gerekirse, “grafik” veya “arsa” aramayı deneyebilirsiniz. Bir uygulamanın fatura oluşturma şeklini değiştirmeniz gerektiğinde, “fatura [e / ing]” veya “fatura” kelimesini ararsınız. Benzer şekilde, kendinize söyleyeceğiniz bir durumu hayal etmeye çalışın: “hm, bu özellik muhtemelen misc ile bulunur”. Yapamam

.NET Framework'e bakın. Bu sınıfların çoğu yardımcı sınıflar değil mi? Demek istediğim, işletme alanıyla ilgili yapacakları çok az şey var. Bir finansal uygulama veya bir e-ticaret web sitesinde veya bir sonraki nesil eğitim platformunda çalışıyorsam, XML'i seri hale getirmek veya dosyaları okumak veya SQL sorguları yapmak veya işlem yapmak hepsi faydalıdır. Ancak, çağrılmazlar UtilitySerializationveya ad alanında UtilityTransactiondeğildirler Utility. İhtiyacım olduğunda onları bulmayı mümkün kılan (ve kolay, .NET geliştiricileri sayesinde!) Uygun isimleri var.

Aynı için geliyor senin yaygın olarak uygulamalarınızda yeniden sınıflar. Onlar faydalı sınıflar değil. Onlar belirli şeyleri yapan sınıflardır ve yaptıkları şeyler aslında sınıfların adları olmalıdır.

Birimlerle ve birimlerin dönüşümüyle ilgili bazı kodlar oluşturduğunuzu hayal edin. Adını verebilir Utilityve meslektaşlarınız tarafından nefret edilebilirsiniz; veya adını Unitsve adını verebilirsiniz UnitsConversion.


7
"Yardımcı sınıflar doğası gereği yanlıştır". İlginç. Bir Math işlevi yardımcı programı sınıfı gibi bir şey için hangi çözümü önerirsiniz? Temel aritmetik işleçlerin dışındaki işlevleri kullanmak için bir Math nesnesinin bir örneği gerçekten gerekli midir?
SinirliFormsDesigner ile

1
Sana katılıyorum, ama alternatif olarak ne öneriyorsun?
kullanıcı


4
Uzun zamandır bir "utils" kütüphanesi oluşturmayı erteledim ama sonunda sadece vermek zorundasın. ) veya yardımcı program yöntemlerinizi, ihtiyaç duyabilecekleri her sınıfa kopyalayıp yapıştırmak (bu "rastgele yöntem koleksiyonunu" sınıfa sokmamak için). Sonunda IMO gerekli bir kötülük.
Matti Virkkunen

3
@FrustratedWithFormsDesigner: sadece ... Math? Her Utilityşeye sonek eklemenin hayatımızı nasıl kolaylaştıracağını anlamıyorum . .NET'in System.Math.Min()yöntemini kullanırken, SystemUtility.MathUtility.Min()bunun yerine gerçekten yazmayı tercih eder misiniz ? Her durumda, cevabımı yoğun bir şekilde düzenlemiştim, bu yüzden şimdi daha net olmalı.
Arseni Mourzenko
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.