it-swarm.com.de

Sollte ich meinen abstrakten Klassen ein "Abstract" -Präfix hinzufügen?

Angenommen, ich habe eine abstrakte Klasse mit dem Namen Task.

Gibt es einen Standard oder eine Konvention, die vorschlagen würde, dass ich ihn stattdessen AbstractTask nennen sollte?

21
juan

Nach Blochs Effective Java (Item 18)) ist das Abstract-Präfix eine Konvention, die in einem speziellen Fall verwendet wird.

Sie können die Vorteile von Schnittstellen und abstrakten Klassen kombinieren, indem Sie eine abstrakte Skelettimplementierungsklasse bereitstellen, die zu jeder nichttrivialen Schnittstelle passt, die Sie exportieren. ... Konventionell werden Skelettimplementierungen als AbstractInterface bezeichnet, wobei Interface der Name der von ihnen implementierten Schnittstelle ist.

Bloch weist aber auch darauf hin, dass der Name SkeletalInterface Sinn gemacht hätte, kommt aber zu dem Schluss

die abstrakte Konvention ist nun fest etabliert.

Wie andere Antworten gezeigt haben, gibt es im Allgemeinen keinen Grund, diese Namenskonvention auf alle abstrakten Klassen anzuwenden.

26
scarfridge

Es gibt keine Konvention. Es geht darum, was Ihnen als Entwickler hilft, schneller und besser zu codieren und anderen zu helfen, Ihren Code zu verstehen.

Fragen Sie die Personen, die den Code sehen und pflegen werden. Was würden sie lieber sehen? Was wird es ihnen leichter machen? Nennen Sie es dann basierend auf dem, was sie möchten.

In einem anderen Hinweis schlägt Code-Konventionen für die Java Programmiersprache: 9. Namenskonventionen keine Anforderung vor:

Klassennamen sollten Substantive sein, im gemischten Fall, wobei der erste Buchstabe jedes internen Wortes groß geschrieben wird. Versuchen Sie, Ihre Klassennamen einfach und beschreibend zu halten. Verwenden Sie ganze Wörter - vermeiden Sie Akronyme und Abkürzungen (es sei denn, die Abkürzung wird viel häufiger verwendet als die Langform wie URL oder HTML).

15
Dynamic

Nein. Intellisense wird mir trivial sagen, ob es abstrakt ist, also verletzen Sie nur DRY hier.

13
DeadMG

Dies ist eine Frage der Präferenz (aber eine schlechte Praxis), aber die meisten Leute mögen es nicht, einen Teil der Qualifikanten im Namen der Klasse zu sehen.

Die meisten IDEs stellen Ihnen diese Informationen ohnehin leicht zur Verfügung, sodass es nicht erforderlich ist, sie in den Namen zu setzen, und es ist sauberer, sie einfach wegzulassen. Es erinnert an die ungarische Notation für die Benennung von Variablen, und das wird heutzutage sicherlich als schlechte Form angesehen. Ich empfehle es einfach Task zu nennen.

9
Oleksi

In .NET wird häufig die Verwendung von "Base" als Suffix zur Bezeichnung einer abstrakten Basisklasse verwendet. Ich würde auf die anderen Antworten zurückgreifen, ob dies in Java üblich ist.

9
KeithS

Meiner Meinung nach sollte der Name einer Entität keine Informationen über ihre Typstruktur, sondern über ihre Semantik enthalten. Es ist also nicht sinnvoll, Ihre Klasse als "AbstractSomething" zu definieren, wenn die Abstraktion nicht Teil ihres Laufzeitziels ist. Dass es sich um eine abstrakte Basisklasse handelt, ist für den Programmierer sichtbar und muss sich nicht im Namen widerspiegeln.

Wenn es jedoch perfekt ist, eine Implementierung einer abstrakten Factory als AbstractFactory zu bezeichnen, da dies mit der Absicht der Klasse zusammenhängt.

Bevorzugen Sie im Allgemeinen Namenskonventionen, die dazu beitragen, die meisten Informationen über das Ziel Ihrer Klasse zu vermitteln.

Halten Sie sich in ähnlicher Weise von SomethingImpl fern. Es ist uns egal, dass es sich um eine Implementierung und nicht um eine Basisklasse handelt. Wenn Ihre Klassenhierarchie ordnungsgemäß für die Vererbung ausgelegt ist, kann jemand davon erben. Sicherlich würde es keinen Wert geben, mehr "Impl" -Suffixe oder andere Artefakte hinzuzufügen. Das Hinzufügen eines Suffixes "Schnittstelle" oder eines Präfixes "I" hat ebenfalls keinen Wert.

Erwägen:

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

Im Gegensatz zu:

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

Letzteres bevorzuge ich bei weitem.


Dies ähnelt in gewisser Hinsicht dem offensichtlicher Missbrauch der ngarische Notation dem letzteren gab ihm seinen schlechten Ruf , als die Leute fälschlicherweise anfingen zu interpretieren Entwickler müssen ihren Variablen einen Indikator für den Variablentyp voranstellen. Während dies manchmal seine Verwendung haben kann (meistens, wenn Sie faul sind, die Definition des Typs nachzuschlagen), ist es meistens nutzlos. Simonyis ursprüngliche Idee mit der ungarischen Notation war es, sie als Mnemonik zu verwenden, um den Entwickler an die Fähigkeiten des Unternehmens zu erinnern, nicht an seinen Typ.

8
haylem

Eine gute Faustregel ist, keine Eigenschaften in einen Namen aufzunehmen, die sich aus der Syntax ergeben. Da Sie in Java eine abstrakte Klasse mit dem passend benannten Schlüsselwort abstract markieren müssen, würde ich sie nicht in den Namen aufnehmen. In C++ zum Beispiel ist der Fall nicht so eindeutig, aber zumindest der Compiler teilt Ihnen mit, wann Sie eine abstrakte Klasse falsch verwendet haben. In so etwas wie Python) ist es keine schlechte Idee, eine abstrakte Klasse explizit als solche zu benennen.

Die übliche Ausnahme von der Regel ist, wenn der Name nicht eindeutig ist. Wenn es aus irgendeinem Grund eine konkrete Unterklasse Task gibt (in anderen Beispielen mag dies sinnvoller sein, aber was auch immer), dann verwenden Sie sicher AbstractTask.

3
protected abstract SomeClass { }

Dies sagt mir, dass dies eine abstrakte Klasse ist. Das Hinzufügen eines Präfixes ist ein Tautologie und Anti-Pattern und in den meisten Fällen nicht geeignet. Siehe den Link, in dem beispielsweise package local Eine Ausnahme darstellt.

In den meisten Fällen sollten Abstract -Klassen nicht Teil einer öffentlich zugänglichen API sein, wenn dies der Fall ist, sollte es wirklich einen guten Grund geben und ein guter Grund sollte einen offensichtlich guten Namen außer AbstractSomeClass liefern.

In den meisten Fällen müssen Sie wahrscheinlich eine Neugestaltung vornehmen, wenn Sie keinen aussagekräftigeren Namen finden können.

3
user7519

Meine fünf Cent, wahrscheinlich haben Sie Implementierungen dieser abstrakten Klasse und sie werden 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask' usw. heißen. Es wird also keinen Namenskonflikt zwischen Ihrer abstrakten 'Task' und ihnen geben.

Darüber hinaus handelt es sich bei "abstraktem" Word um Sprachsyntax, nicht um Geschäftsdomänenentitäten. Daher würde ich es vorziehen, es nicht als Teil des Namens zu verwenden.

Andererseits habe ich in einer Antwort hier einen Auszug aus J.Bloch Effective Java) gesehen, der besagt, dass die Verwendung von 'abstract' als Teil eines Namens eine etablierte Praxis ist Aber in offiziellen Java Code-Konventionen gibt es sowieso nichts darüber.

0
user1449