¿Alguna vez es una buena idea usar el nombre del patrón de diseño en las clases de implementación? [cerrado]

28

Recientemente me encontré con una gran base de código Python moderadamente con una gran cantidad de MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapteretc clases.

Mientras que, por un lado esos nombres me señaló a investigar y aprender los patrones correspondientes, que no eran muy descriptivo de lo que la clase lo hace .

Además, parecen caer dentro de la lista prohibida de palabras en la programación: variable, process_available_information, data, amount, compute: nombres excesivamente amplias, que no nos dicen nada acerca de la función cuando se utiliza por sí mismos .

Entonces, ¿debería haberlo CommunicationManagero más bien PortListener? ¿O tal vez no entiendo el problema en absoluto ...?

Vorac
fuente
si usted está familiarizado con lo que hace el patrón de continuación, el nombre del patrón es una descripción decente, sin embargo solo el nombre del patrón es una mala idea, es mejor tener un MyClassFactory, un FooAdapter, etc.
monstruo de trinquete
Se editó la pregunta para indicar que las clases no se llamaban simplemente "AbstractFactory", sino que también había algunas palabras descriptivas.
Vorac
1
... ¿En serio lo llamaron un en Fctorylugar de un Factory, o es solo un error tipográfico?
Izkata
@Izkata, jajaja, mi mal. Sin embargo, había adaptador y adaptador!
Vorac

Respuestas:

47
  • AbstractFactoryde hecho es una mala elección para un nombre. No hay forma de saber qué crea esta fábrica , y cuando busque una entidad que cree Animals, nunca encontrará la fábrica correspondiente por su nombre.

  • AnimalAbstractFactorytampoco es una elección acertada, ya que en la mayoría de los idiomas, sería redundante con la abstractpalabra clave en la firma.

    Dicho esto, hay varias buenas razones, destacadas por los comentarios, para incluir realmente Abstracten el nombre: no solo hay varios contextos en los que no tiene la firma completa, sino solo el nombre, sino también, manteniendo AnimalFactoryuna interfaz puede ser una buena elección (a menos que, desafortunadamente, la convención del lenguaje / marco sea prefijar las interfaces con I).

  • AnimalCreationUtilityTambién sería una mala elección: si se trata de una fábrica , facilitar las cosas para las personas que leerán el código y llamarlo fábrica .

  • abstract AnimalFactoryesta bien No tiene redundancia, y está claro que es una fábrica abstracta que delega la creación de animales a sus hijos.

Entonces sí, incluir el nombre del patrón de diseño es una buena idea, pero debe ser solo una parte del nombre y no debe ser redundante con las otras partes de la firma.

Arseni Mourzenko
fuente
2
¿Por qué es esto mejor que escribir un comentario en un lugar destacado "En este módulo, implementamos MVC. Motivos: ... Modelos: ... Vistas: ... Controladores: ... Mapa de estructura: ... API :. .. ".
Vorac
37
@Vorac: Tener un nombre claro siempre es mejor que confiar en los comentarios.
Arseni Mourzenko
2
@Vorac, tarde o temprano, alguien agregará una nueva clase sin actualizar ese comentario destacado (o incluso saber sobre su existencia). Si bien es mucho más difícil pasar por alto una convención de nomenclatura utilizada constantemente en toda la aplicación.
Konrad Morawski
2
Mientras navega por la solución de su proyecto, ¿abrirá cada archivo de clase para encontrar lo que hace? No. Por eso siempre es una mejor idea tener clases / archivos de nombres descriptivos.
matriz
2
Me gustaría discrepar amablemente con el segundo punto: creo que AnimalAbstractFactory es una buena opción, porque a pesar de que es redundante en la declaración de clase, sería muy útil en la declaración de clase secundaria: LionFactory extiende AnimalAbstractFactory que, creo, Es una buena información.
Igor
11

Depende del ejemplo específico. El patrón de Constructor casi siempre se sirve mejor nombrando a su clase * Generador, mientras que un Singleton generalmente no necesita ser nombrado como tal.

Si no pone el nombre del patrón en el nombre de su clase, y tal vez incluso si lo hace, generalmente debería poner un comentario en la clase que explique que implementa un patrón específico.

MikeFHay
fuente
3
La consistencia es crucial aquí, porque una vez que solo se llaman algunas fábricas ...Factory, se convierte en un obstáculo mental darse cuenta de que una clase es una fábrica si su denominación rompe esa convención.
Konrad Morawski
10

El objetivo de usar nombres de patrones en las clases es facilitar la comprensión de lo que hace la clase. Si nombra la clase AnimalFactory, es obvio que la clase crea instancias de Animal. Si el nombre de su clase incluye el nombre de un patrón y no describe lo que hace, ha elegido un patrón incorrecto o lo ha implementado incorrectamente.

Pavels
fuente
1

Creo que puede funcionar muy bien. Por ejemplo:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }
CodeART
fuente
1
¿Cómo responde esto a la pregunta que se hace? Según mi lectura, sus "ejemplos" solo muestran una duplicación inútil de nombres de clase y comentarios de código
mosquito
Los comentarios son para justificar el propósito de cada clase en caso de que el nombre de la clase no sea aparente para algunos. Al mirar esto, instantáneamente sé que tengo un comando que hace algo, una consulta que devuelve datos, un decorador que agrega un comportamiento adicional al mecanismo de registro de excepciones existente y una fábrica que crea filtros de cuenta. En mi opinión, cuanto más descriptivo sea con sus nombres de clase, más fácil será para otros leer su código. Si está utilizando un patrón de diseño, dígalo: al final del día, todo el propósito de tener patrones de diseño es facilitar que otros lean su código
CodeART