¿Es una mala idea crear una clase que solo tendrá una instancia?

7

¿Es una mala práctica / diseño de codificación hacer una clase que solo se creará una vez?

Tengo algunas variables y funciones que pueden agruparse bajo una clase para "verse bien" (por falta de una mejor descripción) ya que están relacionadas, pero solo pueden ser variables globales y funciones globales.

(Por cierto, estoy usando JavaScript, AngularJS, Express, MongoDB.)

    
pregunta Alice 04.10.2013 - 05:23

7 respuestas

8

Una sola instancia para una clase tiene sentido si el objeto representa un solo recurso, como una conexión Ethernet o el administrador de tareas del sistema operativo, por ejemplo.

Las funciones se colocan en una clase solo si actúan sobre las variables de las instancias de esa clase, de lo contrario el mantenedor se confundirá con la intención de esa clase.

Por lo general, existe una buena razón para que su aplicación tenga variables globales. Trate de encontrar el propósito común de ellos y diseñe una clase alrededor de este propósito. No solo aclarará el diseño, sino también su mente.

    
respondido por el mouviciel 04.10.2013 - 07:36
12

No hay ningún problema con la escritura de una clase que termina siendo instanciada solo una vez.

Si poner algunas variables y funciones juntas dentro de una clase tiene sentido, tiene un valor semántico o hace que el código sea más fácil de leer y manipular, entonces los mantenedores estarán agradecidos.

Sin embargo, lo que puede estar muy mal es imponer la singularidad desde dentro.

Muchas personas tienden a disparar el patrón de singleton tan pronto como creen que solo necesitarán una instancia de algo. Vea, por ejemplo, cómo no ha descrito su contexto en profundidad, sin embargo, la mayoría de las respuestas ya le sugieren que use un singleton. Y luego, el diseño puede ser atornillado porque si necesitas otra instancia en algún punto por cualquier razón, la clase evitará que lo hagas sin cambiar mucho el código.

Como conclusión, una instancia está bien, pero asegúrese de saber si:

  1. usted solo necesita una instancia, o
  2. usted no puede tener más de una instancia (un caso muy, muy raro en mi experiencia).
respondido por el Julien Guertault 04.10.2013 - 08:48
3
  

¿Es una mala práctica / diseño de codificación hacer una clase que solo se creará una vez?

No, incluso si solo se crea una instancia una vez, necesitas una clase para ello. Pero no suponga que siempre solo necesitará una instancia, ahora y en el futuro.

Supongamos que haces un juego y tienes una clase de jugador:

class Player {
    ...
}

Instalarás una clase de jugador en tu juego y usarás siempre el mismo objeto. No hay nada malo en ello.

Sin embargo, ¡no hagas un Singleton con eso! Hoy diseñas tu juego y piensas que "bueno, siempre será un juego para un solo jugador. Usaré un Singleton para mi jugador". Pero en la versión 2, es posible que desee implementar el modo multijugador, y luego se está metiendo en problemas. Tendrá que volver a escribir y adaptar una gran cantidad de código, ya que su diseño no admite la creación de instancias de múltiples jugadores.

Lo mismo ocurre con los cachés. O los madereros. O interfaces de red. Hoy, crees que solo necesitarás uno, siempre, seguro. Pero en una versión futura necesitas agregar un segundo. Sé consciente de esta situación.

    
respondido por el Uooo 04.10.2013 - 08:26
1

Hay clases singleton y ese es un patrón de diseño común.

También hay clases que nunca se instancian. Si tiene funciones que NO operan en ningún estado persistente (por ejemplo, toman la entrada y la transforman), generalmente puede usar un método estático. En algunos lenguajes (como Java), estos métodos estáticos se declararán en una clase, pero la clase en sí nunca será instanciada.

    
respondido por el Uri 04.10.2013 - 07:34
1

El patrón de singleton es común. Te permite imponer una instancia única de clase.

Pero para algunos es demasiado común, por lo que se convierte en un antipatrón. La razón de esto es porque es prácticamente igual que el estado global. Y cualquier estado global es difícil de burlar y probar y difícil de depurar. Pero al mismo tiempo, tener que pasar explícitamente esta instancia en cualquier parte de su código puede hacer que el código se infle mucho. Pero esto te hará pensar en la arquitectura adecuada. Si el grupo de clases usa este singleton, puede que se relacionen de alguna manera y creen un ancestro común para ellas, que encapsulará esta instancia para ellas.

    
respondido por el Euphoric 04.10.2013 - 07:46
1

Es malo asumir que algo es universalmente malo. En su caso, tal vez sea una buena idea, pero dado que está usando un lenguaje que no es OO en el núcleo, es más apropiado probablemente solo usar métodos sueltos y variables y colocarlos en una biblioteca común que incluya en su biblioteca. otro trabajo.

    
respondido por el jwenting 04.10.2013 - 08:14
1

Estás haciendo dos preguntas en una.

  1. No, no hay nada malo en tener una clase que solo tendrá una instancia.
  2. Agrupar variables y métodos en una clase sin una razón real, es un mal diseño.
respondido por el Tulains Córdova 04.10.2013 - 13:33

Lea otras preguntas en las etiquetas