Cosas que estar preocupado con respecto a este patrón:
- Rompiendo Principio de responsabilidad única
- La implementación funcional de descomposición antipatrón
- no cumplir las expectativas de los consumidores comunes
individual Principio de responsabilidad
Esto es una ligera variación del principio original, pero se aplica en cambio a las funciones. Si su constructor está haciendo más de una cosa (construcción y procesamiento), hace que el mantenimiento de este método sea más difícil en el futuro. Si una persona que llama no quiere procesar durante la construcción, no le dejas ninguna opción. Si el "procesamiento" de un día requiere pasos adicionales que no deberían estar en el constructor, debe refactorizar en cualquier lugar donde use este método.
Funcional de descomposición antipatrón
Sin conocer detalles, estaría preocupado de que el código que hace esto implementa este antipatrón. Los objetos no son realmente objetos, sino unidades de programación funcionales envueltas en un disfraz orientado a objetos.
expectativas de los consumidores comunes
¿Le llama la media esperar que este comportamiento del constructor? Puede haber lugares donde el procesamiento adicional durante la construcción puede ser una conveniencia de programación manual corta. Pero esto debería ser explícitamente documentado y bien entendido por los llamadores.El uso general del objeto aún debería tener sentido en este contexto y debería ser natural para el que llama usarlo de esta manera.
También comprenda lo que está forzando a su consumidor. Si está procesando en el constructor, está obligando al consumidor a pagar ese procesamiento (en términos de tiempo de procesamiento), lo quiera o no. Elimina la posibilidad de hacer un procesamiento "diferido" u otras formas de optimización.
¿Uso aceptable?
Solo en lugares donde el uso común de la clase requiere una inicialización que puede ser opcional en el momento de la construcción. La clase File es un buen ejemplo:
/* This is a common usage of this class */
File f;
f.Open(path);
/* This constructor constructs the object and puts it in the open state in one step
* for convenience */
File f(path);
Pero incluso esto es cuestionable. ¿La clase de archivo mantiene la ruta al archivo internamente o solo se usa para abrir un manejador de archivo? Si almacena la ruta del archivo, ahora Open() y el nuevo constructor tienen más de una responsabilidad (SetPath (p) y Open()). En ese caso, tal vez el constructor de conveniencia de File (path) no debería abrir el archivo, sino simplemente establecer la ruta en el objeto.
Hay muchas consideraciones basadas en los objetos en cuestión. Considere escribir pruebas unitarias para sus objetos. Le ayudarán a resolver muchos de estos casos de uso.
Lee más como si deseara una función estática en ese objeto. – AlG
@ qor72 Definitivamente quiero una instancia de esa clase, pero soy perezoso para escribir variables y llamar al mismo método una y otra vez. – pestaa
No entiendo de ninguna manera por qué esto es más fácil que llamar 'SomeObject-> process ($ param1, $ param2)' directamente. – fearofawhackplanet