2009-08-12 20 views
10

Siempre he pensado que tener una clase solo por mantener constantes es un mal diseño. Pero recientemente, traté de buscar en Google y encontré solo que tener una interfaz como constantes es un mal anti patrón, sin mencionar el uso de una clase de constantes.¿Las constantes globales son un antipatrón?

Soy de la opinión de que, dado que una clase de constantes no es muy diferente de las variables globales, es por eso que estoy en contra de ella y tienden a refactorizar dichas clases. Crea una clase de datos que no tiene absolutamente ningún contexto. Esas constantes están mucho mejor atadas a lo que realmente las usa, para darles contexto y significado, así como para encapsularlas dentro de una clase.

¿Qué piensan los demás?

Respuesta

12

constantes globales no son una mala práctica, siempre y cuando que son ...

  1. ... inmutable - un mundial, final/readonly referencia a un objeto mutable (como una aplicación Java o una ArrayList<T> C# List<T>) no es un estado constante, sino global.
  2. ... necesario por> 1 clase. Si solo una clase necesita tus constantes, coloca las constantes directamente en la clase. (Advertencia: balance de señal vs YAGNI apropiadamente.)

Bloch cubre la "interfaz constante" vs. tema "constante de clase" en Java eficaz, y aboga por el enfoque de "constante de clase". La razón por la que no desea las constantes en una interfaz es que incita a las clases de los clientes a "implementar" esa interfaz (para acceder a las constantes sin incluir el nombre de la interfaz).No deberías, sin embargo, que la interfaz no sea realmente una interfaz para las capacidades del objeto, sino una conveniencia de tiempo de compilación arraigada en el tipo externo de la clase. Considere esto:

interface C { public static final int OMGHAX = 0x539; } 
class A implements C { ... } 
class B { private A a; } 

Clase B ahora innecesariamente tiene una dependencia a C. Si la implementación de A cambia para que no necesite las constantes de C, no puede eliminar implements C sin romper su interfaz externa - alguien (posiblemente una persona muy estúpida, pero tales personas abundan) podría hacer referencia a un objeto A a través de una referencia C!

Al poner las constantes en una clase, y al hacer que la clase no se pueda desinstalar, informa a los clientes que la clase constante realmente solo funciona como un espacio de nombres secundario. En C# marca la clase como static, en Java que te gustaría que sea final y darle una constructora inalcanzable:

final class C { 
    private C() { throw new AssertionError("C is uninstantiable"); } 
    public static final int OMGHAX = 0x539; 
} 

Si programa en Java y desea que las constantes sin un prefijo del nombre de la clase constante, puede usar la funcionalidad import static.

Y sí, es un poco redundante que se vio obligado a crear un nuevo tipo sólo para tener un lugar para poner sus constantes, pero eso es una verruga en lenguajes como Java y C# que tenemos que hacer frente a - nos tenemos poner nuestras constantes en algún lugar, y nuestra mejor opción es una clase no instanciable.

25

Las constantes globales están bien.

Las variables globales (no constantes) son obra del diablo.

5

Creo que el problema de las variables globales es que crean un estado global. Las constantes globales no hacen esto, pero de hecho son responsables de algunas constantes sin contexto, que pueden ser malas.

Lo que me gustaría sugerir si necesita ese tipo de cosas es crear enumeraciones (en caso de tener constantes int) o clases estáticas para las constantes, por lo que se les puede dar un poco de contexto (Math.PI, por ejemplo)

0

Las variables globales han sido ampliamente reconocidas como algo malo y generalmente deben evitarse. Esta es la razón por la cual muchas personas tienen un problema con el patrón Singleton. El problema con las variables globales es que son transitivas.

+1

Sí, pero estoy preguntando acerca de * constantes globales * en realidad. – aberrant80

+0

¿Qué patrones de diseño usan constantes globales? – SwDevMan81

+0

Está hablando de un patrón anti. –

7

Las variables globales son problemáticas porque introducen dependencias en gran parte innecesarias entre los módulos. Estas dependencias dificultan la depuración de problemas y la reutilización del código.

diría que verdaderamente constantes globales son también problemáticas por la misma razón, Así que en lugar de tener un producto único llamado MyGlobals que contienen una constante como MyGlobals.HTTP_SUCCESS_OK, paquete como constantes juntos en sus propias clases, tales como httpStatus .SUCCESS_OK.

+0

Los problemas con los globales se explican aquí: https://softwareengineering.stackexchange.com/a/262972/44844 – Katapofatico

4

Supongo que una cosa que no se menciona son los problemas más pragmáticos. Si está utilizando un lenguaje compilado, tenga en cuenta que debe recompilar para cambiar el valor de la constante. Si se trata de un valor que desea cambiar con frecuencia, también puede considerar un archivo de configuración.

+1

si el valor cambia a menudo, no es una constante :) – gbjbaanb

+2

Quiero decir que el * programador * cambia el valor a menudo, en lugar de cambiar el valor en tiempo de ejecución. –

+0

constante durante la vida de la ejecución de un programa podría hacer bien. Para un proceso de ejecución muy largo, creo que Entropy finalmente lo obtendrá ;-( – djna

2

En algunos casos, las constantes globales son el camino perfecto cuando son realmente constantes (no solo constantes para una compilación del programa, sino supuestamente durante toda la vida útil del producto de software y más).

Por ejemplo, no le conviene tener varias clases cada una declarando su propia constante para pi, e o HTTP_SUCCESS.

Por otro lado, las constantes globales pueden crear muchos de los problemas de las variables globales si son valores arbitrarios que se pueden cambiar, p. debido a los requisitos cambiantes. Es decir. si poner esas constantes en un archivo de configuración parece una opción razonable, no debería ser una constante global.

+0

Los archivos de configuración/propiedades tienen una ventaja más: es mucho más rápido buscar el texto en ellos (cuando necesita cambiar el nombre de la ventana, etiqueta de botón por ejemplo). –

Cuestiones relacionadas