Bueno, creo que se reduce a la diferencia entre lo bueno y lo suficientemente bueno .
Si bien en la mayoría de los casos puede evitar el uso de constantes implementando otros patrones (estrategia o tal vez peso mosca), hay algo que decir sobre no necesitar media docena de otras clases para representar un concepto. Creo que todo se reduce a la probabilidad de que se necesiten otras constantes. En otras palabras, ¿es necesario ampliar el ENUM proporcionado por las constantes en la interfaz? Si puede prever la necesidad de expandirlo, elija un patrón más formal. Si no, entonces puede ser suficiente (será lo suficientemente bueno y, por lo tanto, habrá menos código para escribir y probar). Aquí hay un ejemplo de un uso suficientemente bueno y malo:
Malo:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
Suficientemente bueno:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
Ahora, la razón por la que elegí esos ejemplos es simple. La User
interfaz define una enumeración de tipos de usuario. Es muy probable que se expanda con el tiempo y sería más adecuado para otro patrón. Pero HTTPRequest_1_1
es un caso de uso decente, ya que la enumeración está definida por RFC2616 y no cambiará durante la vida útil de la clase.
En general, no veo el problema con las constantes y las constantes de clase como un problema global . Lo veo como un problema de dependencia. Es una distinción estrecha, pero definida. Veo los problemas globales como variables globales que no se aplican y, como tales, crean una dependencia global suave. Pero una clase codificada crea una dependencia forzada y, como tal, crea una dependencia global dura. Entonces ambos son dependencias. Pero considero que lo global es mucho peor ya que no se aplica ... Por eso no me gusta agrupar las dependencias de clase con las dependencias globales bajo el mismo banner ...
Si escribe MyClass::FOO
, está codificado en los detalles de implementación de MyClass
. Esto crea un acoplamiento duro, lo que hace que su código sea menos flexible y, como tal, debe evitarse. Sin embargo, existen interfaces para permitir exactamente este tipo de acoplamiento. Por tanto MyInterface::FOO
, no introduce ningún acoplamiento de hormigón. Dicho esto, no introduciría una interfaz solo para agregarle una constante.
Entonces, si está usando interfaces, y está muy seguro de que usted (o cualquier otra persona) no necesitará valores adicionales, entonces realmente no veo un gran problema con las constantes de la interfaz ... Lo mejor los diseños no incluirían constantes, condicionales, números mágicos, cadenas mágicas ni nada codificado. Sin embargo, eso agrega tiempo adicional al desarrollo, ya que debe considerar los usos. Mi opinión es que la mayoría de las veces vale la pena tomarse el tiempo adicional para construir un gran diseño sólido. Pero hay ocasiones en las que lo suficientemente bueno es realmente aceptable (y se necesita un desarrollador experimentado para comprender la diferencia), y en esos casos está bien.
Nuevamente, esa es solo mi opinión al respecto ...