2009-02-22 21 views
10

Często znajduję się w sytuacji, w której mam pojęcie reprezentowane przez interfejs lub klasę, a następnie mam serię podklas/podinterfejsów, które ją rozszerzają.Najlepsza praktyka nazywania podklas

Na przykład: rodzajowy "DoiGraphNode" A "DoiGraphNode" reprezentujący zasób A "DoiGraphNode" reprezentujący zasób Java A "DoiGraphNode" z towarzyszącym ścieżce etc., etc.

I może myśleć o trzech konwencjach nazewnictwa i doceniłby komentarze do wyboru.


Opcja 1: Zawsze zaczynaj od nazwy pojęcia.

Zatem: DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath itp

Pro: Jest bardzo jasne, co mam do czynienia z, to łatwo zobaczyć wszystkie opcje mam

Con: Nie bardzo naturalny? Wszystko wygląda tak samo?


Opcja 2: Umieść specjalne rzeczy na początku.

Zatem: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, , itp

Pro: Jest bardzo jasne, kiedy widzę go w kodzie

Con: Znalezienie to może być trudne, zwłaszcza jeśli nie pamiętam nazwy, brak spójności wizualnej


Wariant 3: Umieść specjalny materiał i usunąć niektóre z nadmiarowym tekstu

Zatem: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: Nie, że dużo pisać i czytać Con: Wygląda na to cr * p, bardzo niespójne, może kolidować z innymi nazwami

Odpowiedz

4

Nazwa je takimi, jakimi są.

Jeśli nazywanie ich jest trudne lub niejednoznaczne, często jest to znak, że Klasa robi zbyt wiele (Zasada Odpowiedzialności Pojedynczej).

Aby uniknąć konfliktów nazw, należy odpowiednio wybrać przestrzeń nazw.

Personnally, użyję 3

+1

Wybrałbym również trzecią opcję. W pierwszych dwóch przypadkach istnieje niebezpieczeństwo, że zakończymy "labirynt krętych, długich nazwisk, wszystkie nieco inne", w których trudno jest je przeczytać, a nawet pamiętać, jaka nazwa odpowiada jakiej koncepcji. – starblue

5

użytkowania, co chcesz, to rzecz subiektywna. Ważne jest, aby wyjaśnić, co reprezentuje każda klasa, a nazwy powinny być takie, aby relacje dziedziczenia miały sens. Nie sądzę jednak, że ważne jest, aby zakodować relacje w nazwach; do tego służy dokumentacja (a jeśli twoje imiona są odpowiednie dla obiektów, ludzie powinni być w stanie odgadnąć, co dziedziczy z czego).

Na co warto, ja zazwyczaj użyć opcji 3 iz mojego doświadczenia, patrząc na możliwości innych ludzi kodu 2 jest prawdopodobnie bardziej rozpowszechnione niż wariant 1.

0

Option trzy bardziej logicznie wynika z pojęcia dziedziczenia. Ponieważ specjalizujesz się w interfejsie lub klasie, nazwa powinna pokazywać, że nie używa już podstawowej implementacji (jeśli taka istnieje).

Istnieje wiele narzędzi do sprawdzania, z czego dziedziczy się klasa, więc zwięzła nazwa wskazująca na prawdziwą funkcję klasy będzie większa niż próba spakowania zbyt dużej ilości informacji o typie do nazwy.

2

Można znaleźć wskazówki w dokumencie dotyczącym standardów kodowania, na przykład istnieje dokument IDesign dla C# here.

Osobiście preferuję opcję 2. Zasadniczo jest to sposób, w jaki system .NET Framework nazywa swoje obiekty. Na przykład spójrz na klasy atrybutów. Wszystkie kończą się atrybutem (TestMethodAttribute). To samo dotyczy EventHandlers: OnClickEventHandler jest zalecaną nazwą dla obsługi zdarzeń, która obsługuje zdarzenie Click.

Zwykle staram się postępować zgodnie z tym w projektowaniu własnego kodu i interfejsów. W ten sposób IUnitWriter tworzy StringUnitWriter i DataTableUnitWriter. W ten sposób zawsze wiem, jaka jest ich klasa bazowa i czyta się bardziej naturalnie. Samo-dokumentujący kod jest celem dla wszystkich zwinnych programistów, więc wydaje się, że działa dobrze dla mnie!

1

Zwykle nazywam się podobnie do opcji 1, zwłaszcza gdy klasy będą używane w sposób wieloaspektowy. Moje rozumowanie jest takie, że najważniejsza informacja jest wymieniona jako pierwsza. (tj. Fakt, że podklasa jest w zasadzie tym, czym jest przodek, z (zwykle) rozszerzeniami "dodanymi"). Podoba mi się ta opcja, ponieważ podczas sortowania list nazw klas, powiązane klasy zostaną wymienione razem. tj. Zazwyczaj nazwa jednostki tłumaczeniowej (nazwa pliku) jest taka sama, jak nazwa klasy, więc powiązane pliki klas będą naturalnie wymienione razem. Podobnie jest w przypadku wyszukiwania przyrostowego.

Mimo że korzystałem z opcji 2 wcześniej w mojej karierze programistycznej, unikam jej teraz, ponieważ, jak pan twierdzi, jest ona "niekonsekwentna" i nie wydaje się bardzo ortogonalna.

Często używam opcji 3, gdy podklasa zapewnia istotne rozszerzenie lub specyfikację lub jeśli nazwy byłyby raczej długie. Na przykład, moje zajęcia nazwa systemu plików pochodzą z String ale znacznie rozszerzyć klasę String i mają znacząco różny use/znaczenie:

Directory_entry_name pochodzi od String dodaje bogate funkcjonalności. Nazwa pliku pochodząca od Directory_entry_name ma dość wyspecjalizowane funkcje. Nazwa katalogu wyprowadzona z Directory_entry_name ma również dość specjalistyczne funkcje.

Wraz z opcją 1 zwykle używam niewykwalifikowanej nazwy dla klasy interfejsu. Na przykład mogę mieć łańcuch klasa interence:

  • Text (interfejs)
  • Text_abstract (streszczenie (podstawa) Klasa uogólnienie)
  • Text_ASCII (beton klasy specyficzne dla ASCII kodowania)
  • Text_unicode (konkretna klasa specyficzna dla kodowania Unicode)

Podobno interfejs i abstrakcyjna klasa bazowa automatycznie pojawiają się jako pierwsze na posortowanej liście.