Konwencja nazewnictwa klas C #: czy to BaseClass, ClassBase czy AbstractClass

117

Jakie jest zalecane podejście do nazewnictwa klas bazowych? Czy poprzedza nazwę typu słowem „ Podstawa ” lub „ Abstrakcja ”, czy po prostu dodamy do niego przyrostek „Podstawa”?

Rozważ następujące:

typ: ViewModelnp MainViewModel , ReportViewModel

klasa bazowa: BaseViewModellub ViewModelBaselubAbstractViewModel

Weź również pod uwagę:

typ: Productnp. VirtualProduct , ExpiringProduct

klasa bazowa: BaseProductlub ProductBaselubAbstractProduct

Jak myślisz, który jest bardziej standardowy?

class Entity : EntityBase
{
}

lub

class Entity : BaseEntity
{
}
Soni Ali
źródło

Odpowiedzi:

90

Istnieją przykłady w Ramowej z przyrostkiem zasady, np System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Ale bynajmniej nie wszystkie klasy abstrakcyjne bazowe w ram po tej konwencji (np System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Osobiście unikałbym używania sufiksu, chyba że chciałbym podkreślić fakt, że jest to klasa abstrakcyjna i czułem, że w przeciwnym razie użytkownicy tej klasy mogliby oczekiwać, że nazwa wskaże konkretną implementację.

Joe
źródło
AvoidNazywanie klas bazowych Baseprzyrostkiem, jeśli klasa jest przeznaczona do użytku w publicznych interfejsach API”. Wytyczne dotyczące projektowania ram, strona 174
Yousha Aleayoub
47

Żadne z powyższych. Zastanów się, jaki cel zapewnia twoja klasa bazowa; nazwij to tak. Na przykład podstawową klasą samochodów i rowerów może być pojazd.

Jeśli tworzysz klasy bazowe tylko po to, aby mieć klasę bazową składającą się z jednej klasy i bez innego celu lub powodu, prawdopodobnie robisz coś nie tak.

Paul Sonier
źródło
15
Nie zawsze tak jest i we frameworku znajdziesz wiele klas Base *. CollectionBase, DictionaryBase… etc
Chad Grant
1
Słuszna uwaga, rzeczywiste obiekty powinny dokładnie pasować do artefaktów. Abstrakcja dobra wspólnego powinna być oparta na pojeździe, szczegóły muszą pozostać w tyle, ale także dokładne.
ruslander
45
Warto zauważyć, że niektóre klasy w .NET Framework z sufiksem „Base” zostały nazwane przed wersją 1.0 i Microsoft nie przestrzega już tych konwencji… ale nie mogą teraz zmienić tych nazw. W książce Microsoft Framework Design Guidelines, sekcja 6.2 (która obejmuje klasy podstawowe), wyraźnie odradza się używanie sufiksu „Base”.
Warren Rumak
5
Praktyka, którą widziałem najczęściej stosowaną w wielu językach obiektowych w wielu firmach, polega na tym, że „podstawa” oznacza klasy bazowe, które mają być dziedziczone, a nie używane bezpośrednio. W twoim przykładzie klasa o nazwie „Pojazd” brzmi jak coś, co może być używane i „napędzane” - twierdzi, że jest pojazdem. Jeśli jednak klasa bazowa nosiłaby nazwę „Części pojazdu”, „Podstawowe elementy pojazdu” lub „Zestaw pojazdu” - wiemy, że nie jest to coś, co można bezpośrednio wykorzystać, ale podstawa dla różnych pojazdów.
Slipp D. Thompson
4
Jak wspomniał Warren, podręcznik Microsoft Framework Design Guidelines, sekcja 6.2 o klasach podstawowych: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Mówi się, że należy unikać przyrostka Base: „AVOID nazing klasy bazowe z przyrostkiem „Base”, jeśli klasa jest przeznaczona do użytku w publicznych interfejsach API. "
cwills
5

Jeśli mówisz o wirtualnych klasach bazowych, standardem firmy Microsoft jest ClassnameBase (jak CollectionBase).

Tak - ten Jake.
źródło
3

Myślę, że to kwestia wyboru. Powiedziałbym, że jeśli tworzysz wiele klas bazowych, być może lepiej jest zawsze korzystać z BaseClassname, ponieważ w ten sposób ZAWSZE dowiesz się, jakich klas bazowych możesz zacząć używać, wpisując po prostu Base i uzyskując resztę pomocy Inteligencja. Co by było, gdybyś miał 20 klas bazowych i dodałeś Base jako sufiks i zapomniałeś, jak nazywała się klasa bazowa? Czy chcesz najpierw utworzyć diagram klas z poziomu VS i dowiedzieć się, jakie klasy bazowe są dostępne? Dobrze jest nazwać je ClassBase, gdy jest to tylko jedna lub dwie klasy.

To samo dotyczy decyzji między funkcją GetItems i ItemsGet. Powiedziałbym przynajmniej ze względu na czytelność - wybierz GetItems. Przestrzegaj konwencji :)


źródło
1
Klasy „podstawowe” to sztuczka obiektowa, zobacz komentarz Paula . Często są pomocne, a czasem konieczne, ale nadal są hackem. Jeśli czujesz potrzebę wyszukania wszystkich dostępnych klas podstawowych, dlaczego tak jest? Co ich łączy, co sprawia, że ​​chcesz zobaczyć ich wszystkich razem? Odpowiedź może pomóc Ci znaleźć lepsze nazewnictwo.
Iain
1
@Abhishek: Analogia do GetItemsnie działa - „Get” jest tylko czasownikiem i dlatego ma znaczenie gramatyczne tylko w języku angielskim jako przedrostek, podczas gdy „Base” działa zarówno jako przymiotnik (przedrostek), jak i rzeczownik (sufiks).
Slipp D. Thompson
1
@Iain: Powodem, dla którego ludzie używają „Base” w nazwach klas, nie jest to, że nie mogą znaleźć wszystkich klas bazowych - uzasadnienie jest bliższe odwrotnemu. Chodzi o to, że klasa bazowa wielu pokrewnych klas wyróżnia się od nich, podobnie jak przedrostek „I” ma odróżniać interfejs od klas, które go przyjmują. Widziałem przedrostek / sufiks „Base” używany najczęściej, gdy klasa podstawowa sama nie funkcjonuje - abstrakcyjna według zamierzonego użycia, niezależnie od wymuszonej abstract.
Slipp D. Thompson
@ SlippD.Thompson tak, „znajdź wszystkie klasy” było odpowiedzią na Abhishek. Odpowiedziałem na odpowiedź Paula.
Iain
2

Używamy BaseEntity, ale myślę, że to twoje własne preferencje. Często widuję drugiego.

Po prostu bądź spójny w swoim kontekście, niezależnie od tego, czy chodzi o projekt, przestrzeń nazw, czy, jeśli to możliwe, Twój zespół. Różne konwencje są gorsze niż zła konwencja IMHO.

Gary.Ray
źródło
2

Osobiście odradzałbym w ogóle dodawanie bazy słów. Nigdy nie wiesz, kiedy będziesz musiał zmienić kod i nie będzie to już obiekt bazowy. Biorąc to pod uwagę, robiliśmy to w przeszłości, dodaliśmy przedrostek słowo Base z przodu. Wydaje się, że płynie lepiej.

kemiller2002
źródło
-1

BaseEntity wygląda bardzo podobnie do wielbłąda - strName, bseEntity. Wybrałbym EntityBase, ponieważ najpierw definiuje temat, co pomoże ci szybciej zidentyfikować jego funkcję.

Mike Robinson
źródło
10
Mówisz o notacji węgierskiej, a nie o osłonie wielbłąda. Tak się złożyło, że notacja węgierska zawierała wielbłąda, ale to zupełnie inne rzeczy.
sliderhouserules
-5

Zawsze myśl o alfabetyzowaniu, kiedy nazywasz rzeczy. Naprawdę nie lubię patrzeć na serwer SQL, a każda procedura składowana nosi nazwę usp [coś]. W tych samych wierszach nie należy nadużywać Get i Set jako początkowych nazw funkcji. Zamiast GetItems lub PlaceOrder, pomyśl o nadaniu im nazwy ItemsGet lub OrderPlace.

Ogólnie rzecz biorąc, ClassnameBase / EntityBase byłoby lepszym wyborem.

marcc
źródło
9
Nie zgadzać się; Czytelność. GetItems ma dużo więcej sensu niż ItemsGet.
Nathan Ridley
2
Nie zgadzam się ... z tego samego powodu co powyżej .. ale nie
mogę
W przeciwieństwie do innych komentarzy marcc NIE zasugerował czegoś takiego jak itemgsGet (). Napisał elementy ().
Hontvári Levente