¿Debo agregar un prefijo "Resumen" a mis clases abstractas? [cerrado]

20

Supongamos que tengo una clase abstracta llamada Task.

¿Existe algún estándar o convención que sugiera que debería nombrarlo AbstractTask?

juan
fuente
Las convenciones de nomenclatura enumeradas aquí: oracle.com/technetwork/java/codeconventions-135099.html sugieren que no, aunque este enlace: stackoverflow.com/questions/1006332/… dice que podría y no sería una cosa terrible si lo hiciera.
FrustratedWithFormsDesigner
En C #, la convención estándar es Sufijar con '* Base'.
Den el

Respuestas:

26

Según el Java efectivo de Bloch (elemento 18), el prefijo abstracto es una convención utilizada en un caso especial.

Puede combinar las virtudes de las interfaces y las clases abstractas al proporcionar una clase de implementación esquelética abstracta que vaya con cada interfaz no trivial que exporte. ... Por convención, las implementaciones esqueléticas se denominan AbstractInterface, donde Interface es el nombre de la interfaz que implementan.

Pero Bloch también señala que el nombre SkeletalInterface habría tenido sentido, pero concluye que

La convención abstracta está ahora firmemente establecida.

Como han señalado otras respuestas, en general no hay razón para aplicar esta convención de nomenclatura a todas las clases abstractas.

Scarfridge
fuente
15

No hay convención. Se trata de lo que le ayudará, como desarrollador, a codificar más rápido y mejor, y a ayudar a otros a comprender su código.

Pregunte a las personas que verán y mantendrán el código. ¿Qué preferirían ver? ¿Qué lo hará más fácil para ellos? Luego nómbralo según lo que les gustaría.

En otra nota, las convenciones de código para el lenguaje de programación Java: 9. Las convenciones de nomenclatura no sugieren ningún requisito:

Los nombres de clase deben ser sustantivos, en mayúsculas y minúsculas con la primera letra de cada palabra interna en mayúscula. Intenta mantener los nombres de tus clases simples y descriptivos. Use palabras completas: evite las siglas y abreviaturas (a menos que la abreviatura sea mucho más utilizada que la forma larga, como URL o HTML).

Dinámica
fuente
13

No. Intellisense me dirá trivialmente si es abstracto, así que solo estás violando DRY aquí.

DeadMG
fuente
21
-1 Agregar abstracta un nombre de clase no viola DRY, y no todos usan la inteligencia. Por ejemplo, ¿qué hace si está leyendo el código en una página web, o si es parte de un parche que está viendo en un editor de texto sin formato o una herramienta de diferencia externa?
Bryan Oakley
10
@Bryan: Por supuesto que viola SECO. abstract class AbstractName? Claramente tiene "resumen" dos veces. Y si no está utilizando Intellisense, entonces ese es su problema, todos los demás usan herramientas sensatas para ver el código.
DeadMG
13
"Everbody"? La mayoría de las personas que conozco usan emacs y vi, y algunos usan eclipse. Decir que algo es "tu problema" no es exactamente la definición de trabajo en equipo. Mi punto mal hecho fue que no puedes simplemente establecer una regla general y decir que así es como se hace. Diferentes equipos tienen diferentes requisitos, y no todos necesitan ayuda con Intellisense. Además, como dije, hay muchas veces cuando estás buscando código en alguna herramienta que no sea tu editor principal o IDE.
Bryan Oakley
1
+1 definitivamente viola SECO. Confiar en Intellisense es un poco fuerte, pero cualquiera que use la clase base debería al menos mirar para ver qué están extendiendo como parte de SOLID.
Gary Rowe
8
@BryanOakley ¿por qué no poner también público y final también? El nombre de una clase se vería como PublicAbstractPersonThatImplementsInterfaceHuman. Hmm, no estoy seguro de que sea bueno. Pero estoy de acuerdo, no hay nada como una convención universal: use lo que aumente la productividad colectiva del equipo.
Apoorv Khurasia
9

Esto es algo de preferencia (pero es una mala práctica límite), pero a la mayoría de la gente no le gusta ver parte de los calificadores en el nombre de la clase.

De todos modos, la mayoría de los IDE harán que la información esté fácilmente disponible para usted, por lo que no es necesario ponerle el nombre, y será más limpio omitirla. Es una reminiscencia de la notación húngara para nombres variables, y eso ciertamente se considera una mala forma hoy en día. Recomiendo simplemente llamarlo Task.

Oleksi
fuente
9

En .NET, a menudo se ve el uso de "Base" como sufijo para denotar una clase base abstracta. Me referiría a las otras respuestas sobre si esta es una práctica común en Java.

KeithS
fuente
1
+1 para los sufijos "Base" e "Impl". Hacen un punto estructural (una clase abstracta será la base de algo).
vski
77
@vski: no, estoy totalmente en desacuerdo: son un dolor inútil en el trasero. Por lo general, está perfectamente bien nombrar su interfaz o clase base con un nombre genérico que describa la interfaz y su implementación concreta con nombres más explícitos.
haylem
3
Tiendo a usar ... Base para una clase base detrás de una interfaz. La interfaz ya toma el buen nombre, y el código del cliente no utiliza la clase base de todos modos.
Starblue
1
@Haylem muchos patrones de diseño de Java utilizan interfaces con una sola implementación esperada. Impl es un sufijo muy útil en estos casos.
funkybro
Con respecto al uso de Impl, vea Predeterminado vs Impl : ¡manténgase alejado de Impl! Usar Base como sufijo (por ejemplo, TaskBase) implica que una clase base es un patrón en lugar de una construcción de lenguaje.
Gary Rowe
8

En mi opinión, el nombre de una entidad no debe transmitir información sobre su estructura tipográfica, sino sobre su semántica. Por lo tanto, no tiene sentido definir su clase como "AbstractSomething" si la abstracción no es parte de su objetivo de tiempo de ejecución. Es una clase abstracta base visible para el programador y no necesita reflejarse en el nombre.

Sin embargo, si es perfecto para llamar a una implementación de una fábrica abstracta un AbstractFactory, porque eso se relaciona con la intención de la clase.

En general, favorezca la convención de nomenclatura que ayuda a transmitir la mayor cantidad de información sobre el objetivo de su clase.

Del mismo modo, manténgase alejado de SomethingImpl. No nos importa que sea una implementación y no una clase base. Si su jerarquía de clases está diseñada correctamente para la herencia, entonces alguien podría heredar de ella. Seguramente no tendría valor agregar más sufijos "Impl" u otros artefactos. Tampoco tiene valor agregar un sufijo "Interfaz" o un prefijo "I".

Considerar:

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

Opuesto a:

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

Prefiero el último con diferencia.


Esto, en cierto sentido, es similar al uso indebido descarado de la notación húngara que le dio su mala reputación , ya que la gente comenzó a interpretarlo erróneamente como algo que obligaba a los desarrolladores a prefijar sus variables con un indicador del tipo de variable. Si bien esto a veces puede tener sus usos (principalmente si eres flojo para buscar la definición del tipo), en su mayoría es inútil. La idea original de Simonyi con la notación húngara era usarla como un mnemotécnico para recordarle al desarrollador las capacidades de la entidad, no de su tipo.

haylem
fuente
3

Una buena regla general es no incluir propiedades en un nombre que sean obvias por la sintaxis. Como en Java, debe marcar una clase abstracta con la abstractpalabra clave correctamente nombrada , no la incluiría en el nombre. En C ++, por ejemplo, el caso no es tan claro, pero al menos el compilador le dirá cuándo usó incorrectamente una clase abstracta. En algo como Python nuevamente, nombrar explícitamente una clase abstracta como tal no es una mala idea.

La excepción habitual a la regla es cuando el nombre es ambiguo. Si, por alguna razón, hay una subclase concreta Task(en otros ejemplos, esto puede ser más sensible, pero lo que sea), entonces, seguro, úselo AbstractTask.

Benjamin Kloster
fuente
... o una interfaz como Listy la AbstractListclase (que lo implementa).
3
protected abstract SomeClass { }

Esto me dice que esta es una clase abstracta. Agregar un prefijo es una tautología y un antipatrón y no es apropiado en la mayoría de los casos, vea el enlace donde se habla de package localser una excepción, por ejemplo.

En la mayoría de los casos, las Abstractclases no deberían ser parte de una API pública, si es así, realmente debería haber una buena razón y una buena razón debería proporcionar un nombre obviamente bueno que no sea AbstractSomeClass.

En la mayoría de los casos, si no puede encontrar un nombre más descriptivo, probablemente necesite hacer un nuevo diseño.


fuente
0

Mis cinco centavos, probablemente tendrá implementaciones de esa clase abstracta y se llamarán 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask', etc. Así que no habrá un choque de nombres entre su 'Task' abstracta y ellas.

Además, la palabra "abstracta" se refiere a la sintaxis del lenguaje, no a las entidades de dominio comercial, por lo que preferiría no usarla como parte del nombre.

Por otro lado, en una respuesta aquí vi un extracto de J.Bloch Effective Java que dice que usar 'resumen' como parte de un nombre es una práctica bien establecida. Puede ser asi. Pero de todos modos en las convenciones oficiales de código java no hay nada de eso.


fuente
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- No se puede usar Listcomo nombre para la AbstractListclase porque ese es el nombre de la interfaz. Es una práctica bien establecida y parte del código oficial de Java que se usa donde algo que implementa la interfaz puede o no extender una clase abstracta (que también implementa (algunas de) la interfaz).
-1

Si trabaja en un equipo, entonces todo el equipo debe decidir si debe prefijar las clases abstractas con "Resumen".

Si trabaja por su cuenta, entonces depende completamente de usted, no yo ni nadie más en este sitio.

CodeART
fuente
-2

No soy un desarrollador de Java (INAJD?) Y no conozco la nomenclatura estándar para tales cosas, pero creo que Tasksuena lo suficientemente abstracto como para que pueda estar solo tal como está.

Jesse C. Slicer
fuente
RE: Sufijo base: stackoverflow.com/a/429494/1782
juan
-2

¿Qué pasa si quieres escribir una AbstractSyntaxTreeclase abstracta ? ¿O tal vez solo un resumen SyntaxTree?

No es convencional y puede confundir fácilmente a las personas.

tskuzzy
fuente
-2

He hecho esto. Agregué 'Resumen' como prefijo a mi clase abstracta llamada AbstractOperation. La razón por la que hice esto fue porque había otro paquete que tenía una clase no abstracta llamada Operation, y ayudó a mi equipo y a los programadores que se hicieron cargo más adelante para evitar cualquier confusión entre los dos.

Abhishek Oza
fuente