¿Qué nombres de antipatrones existen? [cerrado]

35

Hay algunos nombres, donde si te encuentras buscando esos nombres, sabes que ya has desordenado algo.

Por ejemplo:

XxxManager
Esto es malo porque una clase debe describir lo que hace la clase. Si la palabra más específica que se te ocurre para lo que hace la clase es "administrar", entonces la clase es demasiado grande.

¿Qué otros antipatrones de nombres existen?

Para aclarar, no estoy preguntando "qué nombres son malos", esa pregunta es completamente subjetiva y no hay forma de responderla. Me pregunto, "qué nombres indican problemas generales de diseño con el sistema". Es decir, si desea llamar a un componente Xyz, eso probablemente indica que el componente está mal concebido. También tenga en cuenta aquí que hay excepciones a cada regla: solo estoy buscando indicadores de advertencia para cuando realmente necesito detener y repensar un diseño.

Billy ONeal
fuente
1
¿Qué tal la Convención de nomenclatura de pitufos ?
back2dos
44
Para aquellos que votan para cerrar como "no constructivo", ¿estarían dispuestos a explicar el motivo? La única con la que esto no funciona demasiado bien es que las respuestas pueden ser cortas, pero ciertamente cumple con las otras cinco pautas ...
Billy ONeal
2
@Aaronaught: ¿Alguna sugerencia? He articulado esto tan bien como puedo en la edición ...
Billy ONeal
1
@jhocking: estoy de acuerdo con parte de ese enlace, especialmente con lo que dice que "Manager" y "Handler" son demasiado valiosos para dejarlos ir. Y no estoy tan convencido de las alternativas basadas en patrones de diseño y otras, que parecen al menos tan vagas en muchos casos. A veces, "Cola" o lo que sea apropiado, pero a menudo el hecho de que un gerente mantenga (o haga referencia) elementos en una cola es solo un aspecto de la gestión de esos elementos. Del mismo modo que el "gerente" expresa algo útil como título de trabajo, la OMI se aplica lo mismo en OOP.
Steve314

Respuestas:

22

Los siguientes antipatrones de nombres están relacionados con .NET y, especialmente, C #:

  • Inconsistencias . Si decidió comenzar cada nombre de campo con un guión bajo, manténgalo .
  • Abreviaturas ambiguas con vocales faltantes . He visto en serio nombres de campo como cxtCtrlMngr. Difícilmente puedes adivinar qué se supone que significa eso.
  • Nombres de variables demasiado largos y detallados . ILoginAttemptRepositoryestá bien y ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappinges descriptivo, es descriptivo, pero definitivamente no está bien.
Marius Schulz
fuente
77
¿Se Isupone que significa interfaceaquí implementero la primera persona del singular? Dado que la mayoría de las clases implementan una interfaz, tener demasiadas clases / interacciones con una letra mayúscula Ies molesto y dificulta la legibilidad, y un olor a código por sí mismo.
usuario desconocido
3
+1 para "Abreviaturas de ambiguos con vocales perdidas" ¡eso me vuelve loco!
FrustratedWithFormsDesigner
66
@Billy ONeal: C ++ tiene interfaces; simplemente no están separados artificialmente de las clases. ;)
Jon Purdy
44
@Billy ONeal: Ese era mi punto.
Jon Purdy
2
@MariusSchulz: oh sí, estoy de acuerdo contigo :) Solo pensé que no era una abreviatura tan terriblemente opaca.
amara
9

Uno con el que me encuentro a menudo es, simplemente, no usar ningún patrón de nomenclatura. Típicamente indicativo de ignorancia del desarrollador (que los patrones de nomenclatura son algo bueno ) y también este antipatrón tiende a violar gravemente SRP al introducir todo tipo de métodos que están relacionados con una clase en esa clase, por ejemplo, un Cliente La clase tiene propiedades, métodos CRUD, cualquier cosa remotamente relacionada con un Cliente que alguna parte de la aplicación necesita.

También agregaré que usar "Engine" como sufijo es casi lo mismo que usar "Manager". Es muy vago y una clase llamada XxxEnginetiende a ser lo que equivale a un Módulo de estilo VB que contiene un montón de métodos, por lo que está en un lugar "fácil de usar", sin ningún conocimiento o idea de programación orientada a objetos.

Wayne Molina
fuente
7

Bueno, primero las respuestas simples: escriba húngaro ( http://mindprod.com/jgloss/unmainnaming.html , también tiene algunas otras ideas geniales. Una visión más equilibrada sobre cuándo húngaro no es malo, http://www.joelonsoftware.com /articles/Wrong.html )

Inca
fuente
77
La notación húngara es SIEMPRE malvada :)
Wayne Molina
12
@Wayne: En realidad, no siempre es malo. Trabajé para Charles en Xerox a fines de los 70 y el sistema de nombres original fue un salvavidas. Estábamos trabajando en BCPL que tiene 1 tipo: entero. Todo lo demás sobre el tipo se transmitió por convenio de uso y denominación. Teníamos 7 programadores + Charles y cualquiera de nosotros podía entrar en el código de otra persona e inmediatamente ser productivo. Esto no quiere decir que no pueda ser torcida / mal aplicado (incluso por Charles), solo que en el contexto correcto fue la solución correcta.
Peter Rowell
3
@ Mario: Lee el artículo de Joel. El sistema de tipos no siempre puede imponer todas las diferencias semánticas entre variables. Intellisense tampoco ayuda en tales casos.
Billy ONeal
44
El tipo es más fácil de inferir que de usar, especialmente. con editores modernos Sin embargo, requiere disciplina. No tienes que prefijar todo . Trabajo en Java, y la mayoría de las veces las aplicaciones húngaras no son necesarias, pero cuando hago algo que requiere varias variables del mismo tipo (como fromX y toX) en los sistemas de coordenadas es un salvavidas.
Michael K
3
Lo que sería bueno es una habilidad general para crear nuevos tipos fácilmente. "Este es como un int, excepto que se aplica a los números de fila".
David Thornley
6

Prefijar una 'I' al nombre de una interfaz, o 'Resumen' al nombre de una clase abstracta. Esto puede ser excusable en lenguajes que no tienen el concepto de clases abstractas, o que no diferencian entre interfaces y clases abstractas, pero en Java, por ejemplo, siempre es una mala idea.

Además, no estoy de acuerdo contigo en lo del Administrador. A veces uso ese patrón, y solo significa que si intentara nombrarlo de otra manera, entonces el nombre no sería más descriptivo que XxxxxManager. Hay algunas tareas (no necesariamente complejas) que simplemente no se pueden resumir claramente en una o dos palabras.

Mike Baranczak
fuente
@ Mike: Estoy totalmente en desacuerdo con tu declaración, lo siento. En mi opinión, XxxxManageres el peor nombre posible que puede tener una clase. ¡Por supuesto que logra algo! Esa es la razón por la que fue escrito. Manageres una palabra de relleno sin sentido que no agrega valor a la comprensión, por su nombre, de lo que es responsable una clase.
Marius Schulz
1
¿Qué tal, digamos TabManager? ¿Tienes un mejor nombre para una clase que controla un mecanismo de pestaña JSP? O jadeo TabController ... En cuanto al prefijo Abstract, siento que se usa en exceso, pero a menudo es válido (consulte las bibliotecas de Java para ver ejemplos). Creo que puedo decir con seguridad que nunca he visto Iinterfaces en ningún lugar donde alguien no intentara programar en una interfaz que no debería haber estado allí. Al igual, solo una clase implementa la interfaz.
Michael K
1
@Darien (Y otros): De cualquier manera, no importa. Ninguno de esos nombres son antipatrones (y, por lo tanto, están fuera del tema de esta pregunta). No creo que pueda decir nada sobre el diseño de un sistema, ya sea que lo usen IXxxo no XxxImpl.
Billy ONeal
2
Esto es totalmente, totalmente incorrecto. Hay muy buenas razones para distinguir visualmente las interfaces de las clases: (a) que no pueden ser instanciadas, (b) que no pueden ser liberados / dispuesta, (c) que no se pueden serializar, (d) que pueden ser proxied / interceptado, etc., etc., etc. Acaba de tirar algo que no le gusta personalmente (por alguna razón extraña e inexplicable) como ejemplo de un antipatrón sin ninguna justificación.
Aaronaught
1
Siempre que sea posible, se deben preferir las interfaces sobre las clases concretas para los tipos de argumento y los tipos de retorno. Por lo tanto, tiene sentido que las interfaces obtengan los nombres "limpios", y las implementaciones concretas (el tipo real del cual la persona que llama puede no saber ni preocuparse) para obtener las verrugas.
Kevin Krumwiede
6

Speeling:

Tengo una discapacidad de inclinación y no puedo deletrear. Sin el corrector ortográfico soy impotente. Intento copiar todos los nombres que creo en un procesador de textos para su verificación, pero siempre echo de menos algunos. En mi último proyecto escribí una gran parte de la API y supongo que no revisé la ortografía la primera vez que usé la palabra responder y supuse que era correcto porque nadie me lo dijo. Teníamos al menos 50 funciones con respuesta. Una nueva persona entró en el equipo y preguntó por qué usamos la respuesta. Me sentí realmente tonto.

repetición
fuente
2
Usé un complemento jQuery brevemente donde estaba uno de los parámetros affect(en lugar del efecto). Me volvió loco y rápidamente encontré un complemento diferente para hacer lo mismo.
zzzzBov
44
El peor problema que tengo es que, una vez que veo un nombre mal escrito, realmente me duele la capacidad de recordar cuáles son los nombres.
David Thornley
1
Empeora cuando la misma cosa se escribe de manera diferente en diferentes partes del código. Como cuando tienes una fuerza de campo de clase Srtength accedida por el método getStrenth ().
Eva
5

Bueno, me temo que mis opiniones son un poco controvertidas. Pero intentemos ...

En lo que a mí respecta, tengo que estar de acuerdo con Mike Baranczak, nombres como XxxController, XxxHandler es algo que realmente usamos a menudo. Para nosotros, un controlador es algo así como un punto de entrada para algo "encapsulado", por ejemplo, administrar transacciones, tratar errores inesperados, llamar a XxxHandler para hacer el trabajo real. Yo diría que un XxxManager es sinónimo de un controlador. Creo que es importante no usar Manager en un caso y Controller en otro. Ser consistente es muy importante si trabajas en equipo.

Sería realmente difícil o tal vez ni siquiera posible encontrar mejores nombres para cosas como esta. Xxx debe elegirse bien para aclarar la situación.

Lo que personalmente no me gusta es, cuando un método llamado get ... o set ... es más que un simple descriptor de acceso. Me gusta det ... para determinar.

Otra cosa que me viene a la mente: según el tío Bob. Una "Y" en el nombre de un método es una señal de hacer demasiado. Pero la vida no siempre es solo en blanco y negro: hay situaciones en las que creo que está bien, por ejemplo. debido a problemas de rendimiento (cuando ya tiene los datos para verificar por qué no procesarlos) ...

Personalmente, también soy un gran admirador de la notación húngara de sistemas: la mayoría de las veces se trata de código fuente en un IDE. Pero a menudo usa solo un editor o navega por el repositorio en un navegador. Una desventaja podría ser el soporte de herramientas debido a los prefijos de tipo ...

Creo que lo más importante es ser constante, una convención subóptima, para mí, es mejor que no tener una convención ...

falange
fuente
1
"Controlador" tiene una semántica diferente que "Administrador". Personalmente, a mí tampoco me gusta, pero "Controlador" pasa porque es un componente común de muchos patrones, particularmente MVC. XxxHandler es igual de malo. Si la clase simplemente "maneja" algo, entonces la clase es demasiado grande o simplemente debería llamarse la parte "Xxx".
Billy ONeal
3
"Sería realmente difícil o tal vez ni siquiera posible encontrar mejores nombres para cosas como esta" , no si diseñaras tu jerarquía de tipos correctamente, con dependencias y responsabilidades bien definidas. Por supuesto, si está utilizando "Controlador" como parte de un MVC o "Controlador" para un controlador genérico de eventos / mensajes, entonces eso es diferente, esos son ejemplos de jerga , pero si solo se usan como nombres genéricos para mal- clases definidas, entonces esa es una gran bandera roja.
Aaronaught
5

Quizás el peor antipatrón de denominación es este:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Tenemos una lista de tres elementos de pares [foo, bar]. Si necesitamos un cuarto, tendremos que agregar nuevas columnas a la tabla.

Llevando a un código como este:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Debe crearse una tabla separada con columnas foo y bar y vincularse a la tabla de cosas:

create table fubar(foo string, bar string, stuff_id long)

La segunda peor es esta:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Aquí tenemos seis campos en lugar de dos instancias de una clase de Dirección.

Este antipatrón está marcado por una serie de nombres de dos partes que enumeran cada combinación de dos conjuntos, por ejemplo, [foo, bar] x [1,2,3] o [inicio, permanente] x [calle, ciudad, estado]

kevin cline
fuente
-1: esto no menciona la denominación en absoluto.
Billy ONeal
¿Un antipatrón de denominación no puede incluir más de un nombre?
Kevin Cline
¿Cómo muchos argumentos ==nombrando antipatrón? Estoy confundido.
Billy ONeal
1
Por lo que yo entiendo, la convención es una que permite números donde se debe tomar un nombre real. Estas cifras llevan a una falsa impresión de que los artículos son una especie de lista o matriz
keppla
3
@Billy ONeal: Sí, lo hacen. El problema del diseño es la falta de normalización, y los sufijos numéricos son el patrón de nomenclatura que lo señala.
reinierpost
3

Cualquier clase o nombre de interfaz que sea una tautología es malo, no solo en Java del que habla el enlace, sino en cualquier idioma.

Tautología (retórica), usando diferentes palabras para decir lo mismo, incluso si la repetición no proporciona claridad.

revs usuario7519
fuente
2
Interesante. Algun ejemplo?
Mike Baranczak
2
Leí el enlace, dice "tautología" ...;)
Benjol
10
La primera regla del club de tautología es la primera regla del club de tautología.
Cercerilla
He leído el enlace (bueno, el contenido del enlace) y no encontró ejemplos
Barjak
bien, de acuerdo con ese enlace, deberíamos dejar de usar I <InterfaceName> ... correcto.
Dal
3

Frecuentemente encuentro bibliotecas de software con nombres genéricos como Libraryo Common. Indican un diseño subóptimo: los desarrolladores hacen un esfuerzo para evitar la duplicación de código pero sin ningún intento de crear un diseño descompuesto en función de la funcionalidad.

reinierpost
fuente
+1: veo "Común" todo el tiempo.
Morgan Herlocker
1

Desde Microsoft al nombrar, puedo proporcionar esta lista para nombres malos:

  1. No son semánticas, lo que significa que tienen nombres que, en lugar de enfatizar en lo que hace, enfatizan en la tecnología que usa o el patrón en el que se basa .
  2. No siguen una consistencia sintáctica. Por ejemplo, parte de los nombres están en camello, mientras que otra parte está en pascal.
  3. Son abreviaturas, que son difíciles de entender, como ScrollableX en lugar de CanScrollHorizontally
  4. Se eligen de tal manera que se metan con las palabras clave de ese entorno.
Saeed Neamati
fuente
2
De hecho, me gusta "ScrollableX" al menos tanto como "CanScrollHorizontally". "X" no es realmente una abreviatura.
user1172763