Czy powinienem dodać prefiks „Abstrakcyjny” do moich klas abstrakcyjnych? [Zamknięte]

20

Załóżmy, że mam klasę abstrakcyjną o nazwie Task.

Czy istnieje norma lub konwencja, która sugerowałaby, żebym AbstractTaskzamiast tego nazwał ją ?

juan
źródło
Wymienione tutaj konwencje nazewnictwa: oracle.com/technetwork/java/codeconventions-135099.html sugerują, że nie, chociaż ten link: stackoverflow.com/questions/1006332/… mówi, że mógłbyś i nie byłoby straszne, gdybyś to zrobił.
FrustratedWithFormsDesigner
W języku C # standardową konwencją jest przyrostek z „* Base”.
Den

Odpowiedzi:

26

Zgodnie z efektywną Javą Blocha (pozycja 18) przedrostek Abstract jest konwencją stosowaną w szczególnym przypadku.

Możesz łączyć zalety interfejsów i klas abstrakcyjnych, zapewniając abstrakcyjną szkieletową klasę implementacji, która będzie pasować do każdego nietrywialnego interfejsu, który eksportujesz. ... Zgodnie z konwencją szkieletowe implementacje nazywają się AbstractInterface, gdzie Interfejs to nazwa interfejsu, który implementują.

Ale Bloch zwraca również uwagę, że nazwa SkeletalInterface miałaby sens, ale podsumowuje to

konwencja abstrakcyjna jest teraz mocno ugruntowana.

Jak wskazały inne odpowiedzi, generalnie nie ma powodu, aby stosować tę konwencję nazewnictwa do wszystkich klas abstrakcyjnych.

szalik
źródło
15

Nie ma konwencji. Chodzi o to, co pomoże Ci, jako programistom, kodować szybciej i lepiej, a także pomóc innym zrozumieć Twój kod.

Zapytaj ludzi, którzy będą widzieć i utrzymywać kod. Co woleliby zobaczyć? Co im to ułatwi? Następnie nazwij to na podstawie tego, co chcieliby.

Inna uwaga: Konwencje kodu dla języka programowania Java: 9. Konwencje nazewnictwa sugerują brak wymagań:

Nazwy klas powinny być rzeczownikami, pisane wielkimi literami, z pierwszą literą każdego wewnętrznego słowa pisanego wielkimi literami. Staraj się, aby nazwy klas były proste i opisowe. Używaj całych słów, unikając akronimów i skrótów (chyba że skrót jest o wiele szerszy niż długi formularz, taki jak URL lub HTML).

Dynamiczny
źródło
13

Nie. Intellisense w sposób trywialny powie mi, czy jest abstrakcyjne, więc tutaj po prostu łamiesz DRY.

DeadMG
źródło
21
-1 Dodanie abstractdo nazwy klasy nie narusza OSUSZANIA i nie wszyscy używają inteligencji. Na przykład, co robisz, gdy czytasz kod na stronie internetowej lub jeśli jest to część łaty, której szukasz w zwykłym edytorze tekstu lub zewnętrznym narzędziu do porównywania?
Bryan Oakley,
10
@Bryan: Oczywiście, że narusza SUSZENIE. abstract class AbstractName? Wyraźnie ma dwa razy „streszczenie”. A jeśli nie używasz Intellisense, to twój problem, wszyscy inni używają rozsądnych narzędzi do przeglądania kodu.
DeadMG
13
„Everbody”? Większość ludzi, których znam, używa emacsa i vi, z kilkoma, którzy używają zaćmienia. Powiedzenie, że coś jest „twoim problemem”, nie jest dokładną definicją pracy zespołowej. Moją słabo uzasadnioną kwestią było to, że nie można po prostu ustawić ogólnej reguły i powiedzieć, że tak to się robi. Różne zespoły mają różne wymagania i nie wszyscy potrzebują pomocy z intellisense. Ponadto, jak powiedziałem, wiele razy patrzysz na kod w jakimś narzędziu innym niż główny edytor lub IDE.
Bryan Oakley
1
+1 zdecydowanie narusza OSUSZANIE. Poleganie na Intellisense jest nieco silne, ale każdy, kto korzysta z klasy podstawowej, powinien przynajmniej spojrzeć, co rozszerza w ramach SOLID.
Gary Rowe,
8
@BryanOakley, dlaczego też nie podać do wiadomości publicznej i ostatecznej? Nazwa klasy wyglądałaby wtedy jak PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, nie jestem pewien, czy to dobrze. Ale zgadzam się, że nie ma czegoś takiego jak uniwersalna konwencja - używaj tego, co zwiększa zbiorową produktywność zespołu.
Apoorv Khurasia
9

Jest to w pewnym sensie kwestia preferencji (ale graniczna zła praktyka), ale większość ludzi nie lubi widzieć części kwalifikatorów w imieniu klasy.

Większość IDE i tak sprawi, że informacje te będą łatwo dostępne, więc umieszczenie ich w nazwie nie jest konieczne, a po prostu pominięcie tego będzie czystsze. Przypomina węgierską notację do nazewnictwa zmiennych, a to z pewnością uważane jest obecnie za złą formę. Polecam po prostu to nazwać Task.

Oleksi
źródło
9

W .NET często widuje się użycie „Base” jako sufiksu oznaczającego abstrakcyjną klasę podstawową. Odłożyłbym się do innych odpowiedzi, czy jest to powszechna praktyka w Javie.

KeithS
źródło
1
+1 za przyrostki „Base” i „Impl”. Tworzą punkt strukturalny (klasa abstrakcyjna będzie podstawą do czegoś).
vski
7
@vski: nie, zdecydowanie się nie zgadzam: to bezużyteczny ból w tyłku. Zasadniczo dobrze jest nazwać interfejs lub klasę podstawową ogólną nazwą opisującą interfejs, a konkretna implementacja z większą liczbą nazw expliit.
haylem
3
Zwykle używam ... Podstawa dla klasy bazowej za interfejsem. Dobra nazwa jest już przejmowana przez interfejs, a klasa podstawowa i tak nie jest używana przez kod klienta.
starblue
1
@Haylem wiele wzorców projektowych Java używa interfejsów z tylko jedną oczekiwaną implementacją. Impl jest bardzo przydatnym przyrostkiem w tych przypadkach.
funkybro,
Jeśli chodzi o korzystanie z Impl, zobacz Default vs Impl - trzymaj się z dala od Impl! Używanie Base jako sufiksu (np. TaskBase) oznacza, że ​​klasa bazowa jest raczej wzorcem niż konstrukcją językową.
Gary Rowe
8

Moim zdaniem nazwa jednostki nie powinna przekazywać informacji o jej strukturze typu, ale o jej semantyce. Dlatego nie ma sensu definiować swojej klasy jako „AbstractSomething”, jeśli abstrakcja nie jest częścią jej celu działania. To, że jest to podstawowa klasa abstrakcyjna, jest widoczne dla programisty i nie musi być odzwierciedlone w nazwie.

Jeśli jednak idealnie nadaje się do nazywania implementacji fabryki abstrakcyjnej nazwą AbstractFactory, ponieważ ma to związek z intencją klasy.

Ogólnie rzecz biorąc, preferuj konwencję nazewnictwa, która pomaga przekazać jak najwięcej informacji o celu twojej klasy.

Podobnie, trzymaj się z dala od SomethingImpl. Nie obchodzi nas, że jest to implementacja, a nie klasa podstawowa. Jeśli twoja hierarchia klas jest odpowiednio zaprojektowana do dziedziczenia, to ktoś może ją odziedziczyć. Z pewnością nie byłoby w nich żadnej wartości dodającej więcej sufiksów „Impl” lub innych artefaktów. Dodanie sufiksu „Interfejs” lub prefiksu „I” również nie ma żadnej wartości.

Rozważać:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

W przeciwieństwie do:

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

Zdecydowanie wolę ten drugi.


To w pewnym sensie podobny do rażącym nadużyciem z notacja węgierska ten ostatni dał mu swoją złą reputację , jak ludzie zaczęli błędnie interpretują go jako wymagające deweloperom poprzedzić ich zmienne ze wskaźnikiem typu zmiennej. Chociaż może to czasem mieć swoje zastosowania (głównie, jeśli jesteś leniwy, aby sprawdzić definicję typu), jest to w większości bezużyteczne. Oryginalnym pomysłem Simonyi z notacją węgierską było użycie go jako mnemonika, aby przypomnieć twórcy o możliwościach jednostki, a nie jej rodzaju.

Haylem
źródło
3

Dobrą zasadą jest, aby nie włączać właściwości do nazwy, które są oczywiste ze składni. Ponieważ w Javie musisz oznaczyć klasę abstrakcyjną trafnie nazwanym abstractsłowem kluczowym, nie zawarłbym jej w nazwie. Na przykład w C ++ sprawa nie jest tak jednoznaczna, ale przynajmniej kompilator powie ci, kiedy niepoprawnie użyłeś klasy abstrakcyjnej. W czymś takim jak Python, wyraźne nazywanie klasy abstrakcyjnej jako takiej nie jest złym pomysłem.

Zwykle wyjątkiem od reguły jest niejednoznaczność nazwy. Jeśli z jakiegoś powodu istnieje konkretna podklasa Task(w innych przykładach może to być bardziej sensowne, ale niezależnie od tego), to na pewno użyj AbstractTask.

Benjamin Kloster
źródło
... lub interfejs taki jak Listi AbstractListklasa (która go implementuje).
3
protected abstract SomeClass { }

To mówi mi, że to klasa abstrakcyjna. Dodanie przedrostka jest tautologią i anty-wzorcem i w większości przypadków nie jest właściwe, zobacz link, na którym mówi package localna przykład o byciu wyjątkiem.

W większości przypadków Abstractklasy nie powinny być częścią publicznie dostępnego interfejsu API, jeśli tak naprawdę powinien istnieć dobry powód, a dobry powód powinien zawierać oczywiście dobrą nazwę inną niż AbstractSomeClass.

W większości przypadków, jeśli nie możesz wymyślić bardziej opisowej nazwy, prawdopodobnie musisz trochę przeprojektować.


źródło
0

Moje pięć centów, prawdopodobnie będziesz miał implementacje tej abstrakcyjnej klasy i będą one nazywać się „SomeSpecificTask”, „TaskWithBubbles”, „StrangeTask” itd. Więc nie będzie konfliktu nazw między twoim abstrakcyjnym „Zadaniem” a nimi.

Ponadto słowo „abstrakcyjne” dotyczy składni języka, a nie jednostek domeny biznesowej, więc wolałbym nie używać go jako części nazwy.

Z drugiej strony, w jednej odpowiedzi tutaj widziałem fragment J.Bloch Effective Java, który mówi, że używanie „abstrakcji” jako części nazwy jest ugruntowaną praktyką. Może tak być. Ale tak czy inaczej, w oficjalnych konwencjach kodu Java nie ma nic na ten temat.


źródło
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- nie można używać Listjako nazwy AbstractListklasy, ponieważ taka jest nazwa interfejsu. Jest to dobrze znana praktyka i część oficjalnego kodu Java, który jest używany, gdy coś, co implementuje interfejs, może, ale nie musi, rozszerzyć klasę abstrakcyjną (która również implementuje (część) interfejsu).
-1

Jeśli pracujesz w zespole, cały zespół musi zdecydować, czy powinieneś poprzedzać klasy abstrakcyjne „Streszczenie”.

Jeśli pracujesz na własną rękę, to zależy wyłącznie od Ciebie, a nie ode mnie lub kogokolwiek innego na tej stronie.

CodeART
źródło
-2

Nie jestem programistą Java (INAJD?) I nie znam standardowej nomenklatury dla takich rzeczy, ale wydaje mi się, że Taskbrzmi to wystarczająco abstrakcyjnie, że może być samodzielne w obecnej postaci.

Jesse C. Slicer
źródło
RE: Sufiks Podstawa: stackoverflow.com/a/429494/1782
juan
-2

Co jeśli chcesz napisać abstrakcyjną AbstractSyntaxTreeklasę? A może po prostu streszczenie SyntaxTree?

To nie jest konwencjonalne i może łatwo pomylić ludzi.

tskuzzy
źródło
-2

Ja to zrobiłem. Dodałem „Streszczenie” jako przedrostek do mojej klasy abstrakcyjnej o nazwie AbstractOperation. Powodem, dla którego to zrobiłem, był inny pakiet, który miał nieabstrakcyjną klasę o nazwie Operacja, i pomógł mojemu zespołowi i programistom, którzy później przejęli kontrolę, unikając pomyłki między nimi.

Abhishek Oza
źródło