Me sigue sorprendiendo la gente que todavía no ve ningún problema en meter números sin sentido en sus programas. Espero poder hacerles ver la ventaja de usar constantes (o variables al menos).
Vamos a comenzar con este ejemplo:
<?php class Precios { private $precioBase = 0; public function setPrecioBase($precioBase) { $this->precioBase = $precioBase; } public function getPrecioFinal() { return $this->precioBase * (1.21); } }
¿Qué es lo que hace el método getPrecioFinal? Por su nombre sabemos que calcula el precio final. Mirando al cuerpo de la función vemos que calcula el precio final a partir del precio base. Y lo multiplica con 1.21. Si sabemos hay un impuesto que es del 21% podemos llegar a la conclusión de que le estamos añadiendo el impuesto.
Nos ha costado un pequeño esfuerzo pero ya lo hemos conseguido.
Pero ¿y si no estamos en lo cierto? Y si en realidad está sumando la comisión del comercial que, casualmente, es del 21%.
¿Cómo podemos estar seguros? Pues podemos preguntar al que creó la clase (mala suerte si fuimos nosotros mismos y ya no nos acordamos), podemos buscar en la documentación… o podemos probar suerte y cruzar los dedos (al fin y al cabo no creo que ninguna central nuclear use este código para evitar una fusión del núcleo).
Y, suponiendo que se tratase de un impuesto, ¿qué pasa cuando hay cambia el porcentaje del mismo? (que sí, ocurre). Imagina que tenemos un montón de métodos y de lugares en los que aparece el misterioso 1.21. Pues nada… usamos la opción de reemplazar texto de nuestro editor y listo ¡a lo loco!
Bien, ya lo ha resuelto. Pero ¿y qué haces si te encuentras con una función así?
class Precios { private $precioBase = 0; public function setPrecioBase($precioBase) { $this->precioBase = $precioBase; } public function getPrecioFinal() { return $this->precioBase * (1.21) * (1.21); } }
¡Pero si multiplica por dos números! ¿Será dos veces el impuesto? ¿El impuesto y la comisión del comercial? ¡Qué dilema!
¿Ahora qué pasa si quieres cambiar el impuesto? No podrías usar el reemplazo de tu editor porque cambiarías los dos números.
Vale ¿cómo solucionamos esta hecatombe?
Pues para eso, amigo mío, están las constantes. Compara el código con éste otro:
class Precios { private $precioBase = 0; const IMPUESTO = 1.21; const COMSISION_COMERCIAL = 1.21; public function setPrecioBase($precioBase) { $this->precioBase = $precioBase; } public function getPrecioFinal() { return $this->precioBase * self::IMPUESTO * self::COMSISION_COMERCIAL; } }
¿Ves lo rápido y cómodo que se entiende ahora el código? Aquí no tenemos ninguna duda de lo que se está haciendo.
Además, si queremos cambiar el valor del impuesto o la comisión del comercial bastaría con cambiar el valor de la constante.