C # Sınıf adlandırma kuralı: BaseClass mı ClassBase mi yoksa AbstractClass mı


117

Temel sınıfları adlandırmak için önerilen yaklaşım nedir? Tür adının önüne " Base " veya " Abstract " mı geliyor yoksa sadece "Base" mi ekleyeceğiz?

Aşağıdakileri göz önünde bulundur:

tür: ViewModelörneğin MainViewModel , ReportViewModel

temel sınıf: BaseViewModelveya ViewModelBaseveyaAbstractViewModel

Ayrıca şunları da göz önünde bulundurun:

tür: Productör. VirtualProduct , ExpiringProduct

temel sınıf: BaseProductveya ProductBaseveyaAbstractProduct

Hangisinin daha standart olduğunu düşünüyorsunuz?

class Entity : EntityBase
{
}

veya

class Entity : BaseEntity
{
}


Yanıtlar:


90

Örneğin Baz soneki ile Çerçevede örneği vardır System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Ama hiçbir şekilde Çerçevesinde tüm soyut temel sınıflar bu uylaşımını (örneğin System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Kişisel olarak , soyut bir sınıf olduğu gerçeğini vurgulamak istemediğim ve aksi takdirde sınıfın kullanıcılarının adın somut bir uygulamayı belirtmesini bekleyebileceklerini düşünmediğim sürece soneki kullanmaktan kaçınırdım .


" Sınıf genel API'larda kullanılmak üzere tasarlanmışsa, Avoidtemel sınıfları bir Basesonek ile adlandırmak ." Çerçeve Tasarım Yönergeleri, sayfa 174
Yousha Aleayoub

47

Yukarıdakilerin hiçbiri. Temel sınıfınızın ne amaçla sağladığını düşünün; buna isim verin. Örneğin, Otomobil ve Bisiklet'in temel sınıfı Araç olabilir.

Sadece bir sınıfın temel sınıfına sahip olmak için temel sınıflar oluşturuyorsanız ve bunun dışında bir amaç veya sebep olmadan, muhtemelen yanlış bir şey yapıyorsunuzdur.


15
Bu her zaman böyle değildir ve çerçevede birçok Base * sınıfı bulacaksınız. CollectionBase, DictionaryBase .... etc
Chad Grant

1
İyi bir nokta, gerçek dünya nesnelerinin tam olarak eserlere uyması gerektiğidir. Müştereklerin soyutlaması Araç gibi temel alınmalı, ayrıntılar geride kalmalı ama aynı zamanda kesin.
ruslander

45
NET Framework'te "Temel" soneki olan bazı sınıfların 1.0 sürümünden önce adlandırıldığını ve Microsoft'un artık bu kurallara uymadığını belirtmek gerekir .... ancak şimdi adları değiştiremezler. Microsoft'un Çerçeve Tasarım Yönergeleri kitabı, bölüm 6.2 (temel sınıfları kapsar), özellikle "Temel" son ekinin kullanılmamasını önerir.
Warren Rumak

5
Bir dizi şirkette bir dizi OO dilinde en sık kullanıldığını gördüğüm uygulama, "Base" in yalnızca miras alınması amaçlanan temel sınıfları atamasıdır - doğrudan kullanılmamalıdır. Örneğinizle, "Araç" adlı bir sınıf, kullanılabilen ve "sürülen" bir şeye benziyor - kendisinin bir araç olduğunu iddia ediyor. Bununla birlikte, temel sınıfa "Araç Parçaları" veya "Araç Esasları" veya "Araç Kiti" adı verildiyse, bunun doğrudan kullanılabilir bir şey olmadığını, ancak çeşitli araçlar için bir temel olduğunu biliyoruz.
Slipp D. Thompson

4
Warren tarafından belirtildiği gibi, Microsoft Çerçeve Tasarım Yönergeleri kitabının Temel Sınıflar için bölüm 6.2: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Temel sonekinden kaçınılması gerektiğini söylüyorlar: "AVOID adlandırma Sınıf genel API'larda kullanılmak üzere tasarlanmışsa "Temel" son eki olan temel sınıflar. "
2016

5

Sanal temel sınıflardan bahsediyorsanız, Microsoft'un standardı ClassnameBase'dir (CollectionBase gibi.)


3

Bunun bir seçim meselesi olduğunu düşünüyorum. Çok sayıda temel sınıf oluşturuyorsanız, o zaman belki de BaseClassname ile gitmek daha iyidir, çünkü bu şekilde HER ZAMAN yalnızca Base yazarak ve geri kalan yardımı alarak hangi temel sınıfları kullanmaya başlayabileceğinizi öğrenebilirsiniz. İyileştirmek. Ya 20 Base sınıfınız varsa ve son ek olarak Base eklediyseniz ve temel sınıfın adının ne olduğunu unuttuysanız? Önce VS'den bir sınıf diyagramı oluşturmak ve hangi temel sınıfların mevcut olduğunu öğrenmek ister misiniz? Sadece bir veya iki sınıf olduğunda onlara ClassBase adını vermek sorun değil.

Aynısı GetItems ve ItemsGet işlevi arasındaki karar için de geçerlidir. En azından okunabilirlik uğruna şunu söyleyebilirim - GetItems'e gidin. Kuralları takip edin :)


1
'Temel' sınıflar bir OO kesmesidir, Paul'ün yorumuna bakın . Genellikle yardımcı olurlar ve bazen gereklidirler, ancak yine de bir hack'lerdir. Mevcut tüm temel sınıfları aramanız gerekiyorsa, neden bu? Hepsini bir arada görme ihtiyacınızı yaratan neler paylaşıyorlar? Cevap, daha iyi bir isim bulmanıza yardımcı olabilir.
Iain

1
@Abhishek: Benzetme GetItemsişe yaramıyor - "Get" yalnızca bir fiildir ve bu nedenle bir önek olarak yalnızca İngilizce dilbilgisi anlamını sağlarken, "Base" hem sıfat (önek) hem de isim (sonek) olarak çalışır.
Slipp D. Thompson

1
@Iain: İnsanların sınıf adlarında "Base" kullanmasının nedeni, tüm temel sınıfları bulabilmek değil - mantık tam tersine daha yakın. Öyle ki, bir dizi ilgili sınıfın temel sınıfı onlardan sıyrılır, tıpkı "I" ön ekinin bir arabirimi onu benimseyen sınıflardan ayırması gibi. Temel sınıf kendi başına işlevsel olmadığında en sık kullanılan "Temel" önekini / son ekini gördüm - zorunlu kılınmış ne olursa olsun amaçlanan kullanıma göre soyut abstract.
Slipp D. Thompson

@ SlippD.Thompson evet, 'tüm sınıfları bul', Abhishek'a bir yanıttı. Paul'un cevabına cevap verdim.
Iain

2

BaseEntity kullanıyoruz, ancak bunun sizin kendi tercihiniz olduğunu düşünüyorum. Sık sık diğerini görüyorum.

Projeniz, ad alanınız veya mümkünse ekibiniz gibi bağlamınız içinde tutarlı olun. Farklı sözleşmeler, kötü bir sözleşmeden daha kötüdür IMHO.


2

Şahsen, kelime tabanı eklememeyi tavsiye ederim. Kodu ne zaman değiştirmeniz gerekeceğini asla bilemezsiniz ve artık temel nesne olmayacaktır. Bununla birlikte, bunu geçmişte yaptık, ön tarafa Base kelimesini ekledik. Daha iyi akıyor gibi görünüyor.


-1

BaseEntity, deve durumuna çok benziyor - strName, bseEntity. Önce özneyi tanımladığı için EntityBase'i tercih ederim, bu da işlevini daha hızlı belirlemenize yardımcı olur.


10
Macar notasyonundan bahsediyorsun, deve kasasından değil. Macar notasyonu deve kasalıydı, ancak bunlar tamamen farklı şeyler.
sliderhouserules

-5

Bir şeyleri adlandırırken her zaman alfabetik sıralamayı düşünün. Gerçekten bir SQL sunucusuna bakmaktan hoşlanmıyorum ve her saklı yordam usp [bir şey] olarak adlandırılır. Aynı doğrultuda Get ve Set'i bir işlev için baştaki adlar olarak aşırı kullanmayın. GetItems veya PlaceOrder yerine, bunları ItemsGet veya OrderPlace olarak adlandırmayı düşünün.

Bu nedenle, genel olarak ClassnameBase / EntityBase daha iyi bir seçim olacaktır.


9
Katılmıyorum; Okunabilirlik. GetItems, ItemsGet'ten çok daha mantıklı.
Nathan Ridley

2
Katılmıyorum ... yukarıdakiyle aynı sebep ... ama oy veremiyor ... :(
Mugunth

Diğer yorumların aksine marcc, itemgsGet () gibi bir şey ÖNERMEDİ. Öğeler yazdı ().
Hontvári Levente
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.