Dois-je ajouter un préfixe «abstrait» à mes classes abstraites? [fermé]

20

Supposons que j'ai une classe abstraite nommée Task.

Existe-t-il une norme ou une convention qui suggérerait que je le nomme à la AbstractTaskplace?

juan
la source
Les conventions de dénomination répertoriées ici: oracle.com/technetwork/java/codeconventions-135099.html suggèrent que non, bien que ce lien: stackoverflow.com/questions/1006332/… indique que vous pourriez et que ce ne serait pas une chose terrible si vous le faisiez.
FrustratedWithFormsDesigner
En C #, la convention standard est de suffixer avec '* Base'.
Den

Réponses:

26

Selon le Java efficace de Bloch (point 18), le préfixe abstrait est une convention utilisée dans un cas spécial.

Vous pouvez combiner les vertus des interfaces et des classes abstraites en fournissant une classe d'implémentation squelettique abstraite pour accompagner chaque interface non triviale que vous exportez. ... Par convention, les implémentations squelettiques sont appelées AbstractInterface, où Interface est le nom de l'interface qu'elles implémentent.

Mais Bloch souligne également que le nom SkeletalInterface aurait eu un sens, mais conclut que

la convention abstraite est désormais solidement établie.

Comme d'autres réponses l'ont souligné, il n'y a généralement aucune raison d'appliquer cette convention de dénomination à toutes les classes abstraites.

écharpe
la source
15

Il n'y a pas de convention. Tout dépend de ce qui vous aidera, en tant que développeur, à coder plus rapidement et mieux, et à aider les autres à comprendre votre code.

Demandez aux personnes qui verront et conserveront le code. Que préfèrent-ils voir? Qu'est-ce qui leur facilitera la tâche? Ensuite, nommez-le en fonction de ce qu'ils aimeraient.

Sur une autre note, les conventions de code pour le langage de programmation Java: 9. Les conventions de dénomination ne suggèrent aucune exigence:

Les noms de classe doivent être des noms, en casse mixte avec la première lettre de chaque mot interne en majuscule. Essayez de garder vos noms de classe simples et descriptifs. Utilisez des mots entiers - évitez les acronymes et les abréviations (sauf si l'abréviation est beaucoup plus largement utilisée que la forme longue, comme URL ou HTML).

Dynamique
la source
13

Non. Intellisense me dira trivialement si c'est abstrait, donc vous violez simplement DRY ici.

DeadMG
la source
21
-1 L'ajout abstractà un nom de classe ne viole pas DRY, et tout le monde n'utilise pas l'intelligence. Par exemple, que faites-vous si vous lisez le code sur une page Web ou s'il fait partie d'un correctif que vous regardez dans un éditeur de texte brut ou un outil de diff externe?
Bryan Oakley
10
@Bryan: Bien sûr, il viole DRY. abstract class AbstractName? A clairement "abstrait" deux fois. Et si vous n'utilisez pas Intellisense, c'est votre problème, tout le monde utilise des outils sensés pour afficher le code.
DeadMG
13
"Tout le monde"? La plupart des gens que je connais utilisent emacs et vi, avec quelques-uns qui utilisent eclipse. Dire que quelque chose est "votre problème" n'est pas exactement la définition du travail d'équipe. Mon argument mal fait était que vous ne pouvez pas simplement définir une règle générale et dire que c'est ainsi. Différentes équipes ont des exigences différentes, et tout le monde n'a pas besoin d'aide avec intellisense. De plus, comme je l'ai dit, il y a de nombreuses fois où vous regardez du code dans un outil autre que votre éditeur principal ou IDE.
Bryan Oakley
1
+1 viole définitivement DRY. S'appuyer sur Intellisense est un peu fort, mais toute personne utilisant la classe de base devrait au moins regarder pour voir ce qu'elle étend dans le cadre de SOLID.
Gary Rowe
8
@BryanOakley pourquoi ne pas aussi rendre public et final? Un nom de classe ressemblerait alors à PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, je ne suis pas sûr que ce soit bon. Mais je suis d'accord, il n'y a rien de tel qu'une convention universelle - utiliser tout ce qui augmente la productivité collective de l'équipe.
Apoorv Khurasia
9

C'est un peu une question de préférence (mais une mauvaise pratique limite), mais la plupart des gens n'aiment pas voir une partie des qualificatifs au nom de la classe.

La plupart des IDE rendront ces informations facilement disponibles de toute façon, il n'est donc pas nécessaire de les mettre dans le nom, et il sera plus simple de les omettre. Cela rappelle la notation hongroise pour le nommage des variables, et c'est certainement considéré comme une mauvaise forme de nos jours. Je recommande simplement de l'appeler Task.

Oleksi
la source
9

Dans .NET, l'utilisation de "Base" comme suffixe pour désigner une classe de base abstraite est souvent observée. Je m'en remets aux autres réponses pour savoir s'il s'agit d'une pratique courante en Java.

KeithS
la source
1
+1 pour les suffixes "Base" et "Impl". Ils font un point structurel (une classe abstraite sera la base de quelque chose).
vski
7
@vski: non, je suis fortement en désaccord: c'est une douleur inutile dans le cul. Il est généralement parfaitement bien de nommer votre interface ou classe de base avec un nom générique pour décrire l'interface, et votre implémentation concrète avec des noms plus explicites.
haylem
3
J'ai tendance à utiliser ... Base pour une classe de base derrière une interface. Le bon nom est déjà pris par l'interface, et la classe de base n'est de toute façon pas utilisée par le code client.
starblue
1
@Haylem de nombreux modèles de conception Java utilisent des interfaces avec une seule implémentation attendue. Impl est un suffixe très utile dans ces cas.
funkybro
Concernant l'utilisation d'Impl, voir Default vs Impl - restez à l'écart d'Impl! L'utilisation de Base comme suffixe (par exemple TaskBase) implique qu'une classe de base est un modèle plutôt qu'une construction de langage.
Gary Rowe
8

À mon avis, le nom d'une entité ne doit pas transmettre d'informations sur sa structure de type, mais sur sa sémantique. Il n'est donc pas logique de définir votre classe comme "AbstractSomething" si l'abstraction ne fait pas partie de son objectif d'exécution. Le fait qu'il s'agit d'une classe abstraite de base est visible pour le programmeur et n'a pas besoin d'être reflété dans le nom.

Cependant, si rend parfait pour appeler une implémentation d'une fabrique abstraite, une AbstractFactory, car cela se rapporte à l'intention de la classe.

En général, privilégiez les conventions de dénomination qui aident à transmettre le plus d'informations sur l'objectif de votre classe.

De même, restez à l'écart de SomethingImpl. Peu importe que ce soit une implémentation et non une classe de base. Si votre hiérarchie de classes est conçue correctement pour l'héritage, quelqu'un pourrait en hériter. Il n'y aurait sûrement aucune valeur à ajouter plus de suffixes "Impl" ou d'autres artefacts. Il n'y a également aucune valeur à ajouter un suffixe "Interface" ou un préfixe "I".

Considérer:

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

Par opposition à:

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

Je préfère de loin ce dernier.


Cela, à certains égards, similaire à l' utilisation abusive flagrante de la notation hongroise que celle-ci lui a donné sa mauvaise réputation , car les gens ont commencé à tort à l'interpréter comme obligeant les développeurs à préfixer leurs variables avec un indicateur du type de la variable. Bien que cela puisse parfois avoir ses utilisations (surtout si vous êtes paresseux pour rechercher la définition du type), c'est surtout inutile. L'idée originale de Simonyi avec la notation hongroise était de l'utiliser comme mnémonique pour rappeler au développeur les capacités de l'entité, pas de son type.

haylem
la source
3

Une bonne règle d'or consiste à ne pas inclure dans un nom des propriétés évidentes d'après la syntaxe. Étant donné qu'en Java, vous devez marquer une classe abstraite avec le abstractmot-clé bien nommé , je ne l'inclurais pas dans le nom. En C ++, par exemple, le cas n'est pas aussi clair, mais au moins le compilateur vous dira quand vous avez utilisé incorrectement une classe abstraite. Dans quelque chose comme Python, nommer explicitement une classe abstraite en tant que telle n'est pas une mauvaise idée.

L'exception habituelle à la règle est lorsque le nom est ambigu. Si, pour une raison quelconque, il existe une sous-classe concrète Task(dans d'autres exemples, cela peut être plus judicieux, mais peu importe), alors bien sûr, utilisez AbstractTask.

Benjamin Kloster
la source
... ou une interface telle que Listet la AbstractListclasse (qui l'implémente).
3
protected abstract SomeClass { }

Cela me dit que c'est une classe abstraite. L'ajout d'un préfixe est une tautologie et anti-modèle et n'est pas approprié dans la plupart des cas, voir le lien où il parlepackage local être une exception par exemple.

Dans la plupart des cas, les Abstractclasses ne doivent pas faire partie d'une API accessible au public, si c'est le cas, il devrait y avoir vraiment une bonne raison et une bonne raison devrait fournir un nom évidemment bon autre que AbstractSomeClass.

Dans la plupart des cas, si vous ne pouvez pas trouver un nom plus descriptif, vous devrez probablement faire une refonte.


la source
0

Mes cinq cents, vous aurez probablement des implémentations de cette classe abstraite et elles seront nommées "SomeSpecificTask", "TaskWithBubbles", "StrangeTask", etc.

De plus, le mot «abstrait» concerne la syntaxe du langage, pas les entités du domaine métier, donc je préfère ne pas l'utiliser comme partie du nom.

D'un autre côté, dans une réponse, j'ai vu un extrait de J.Bloch Effective Java qui dit que l'utilisation de «abstrait» comme partie d'un nom est une pratique bien établie. Il en est peut-être ainsi. Mais de toute façon dans les conventions officielles du code java, il n'y a rien à ce sujet.


la source
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- on ne peut pas utiliser Listcomme nom pour la AbstractListclasse car c'est le nom de l'interface. C'est une pratique bien établie et une partie du code Java officiel qui est utilisé lorsque quelque chose qui implémente l'interface peut ou non étendre une classe abstraite (qui implémente également (une partie de) l'interface).
-1

Si vous travaillez en équipe, c'est toute l'équipe qui doit décider si vous devez préfixer les classes abstraites avec "Résumé".

Si vous travaillez seul, c'est à vous de décider, pas à moi ni à personne d'autre sur ce site.

CodeART
la source
-2

Je ne suis pas un développeur Java (INAJD?) Et je ne connais pas la nomenclature standard pour de telles choses, mais je pense que cela Tasksemble suffisamment abstrait pour qu'il puisse être autonome tel quel.

Jesse C. Slicer
la source
RE: Suffixe de base: stackoverflow.com/a/429494/1782
juan
-2

Et si vous voulez écrire une AbstractSyntaxTreeclasse abstraite ? Ou peut-être juste un résumé SyntaxTree?

Ce n'est pas conventionnel et cela peut facilement dérouter les gens.

tskuzzy
la source
-2

Je l'ai fait. J'ai ajouté «Abstract» comme préfixe à ma classe abstraite nommée AbstractOperation. La raison pour laquelle j'ai fait cela était qu'il y avait un autre paquet qui avait une classe non abstraite nommée Operation, et cela a aidé mon équipe et les programmeurs qui ont pris le relais plus tard en évitant toute confusion entre les deux.

Abhishek Oza
la source