Actualmente estoy trabajando en una base de código que tiene muchas clases que implementan un método de Inicio. Esto me parece una construcción en dos fases, que siempre he considerado una mala práctica. No puedo decir la diferencia entre esto y un constructor.
¿Cuándo es apropiado usar un método de inicio en lugar de la construcción normal de objetos?
¿Cuándo debería preferir usar el constructor?
Editar: no creo que sea tan relevante, pero el lenguaje de programación es C #, podría aplicarse igualmente a Java o C ++
object-oriented-design
construction
constructors
Dave Hillier
fuente
fuente
start
y el constructor? etc ...init
método de algún tipo fuera de lanew
función: perldoc.perl.org/perlobj.html . Los modismos de un idioma pueden funcionar bien allí y no en otros idiomas.Start
métodos en API comunes incluyen subprocesos y cronómetros.Respuestas:
Un
Start()
método (comoRun()
,Execute()
o algo similar) es apropiado cuando el costo de construir el objeto es bajo, pero el costo de usarlo es alto. Por ejemplo: una clase que encapsula un algoritmo de optimización de la mejor ruta. Es trivial configurarlo con un conjunto de parámetros (X
cuadrados porY
cuadrados, con tal método de evaluación), pero puede tardar un tiempo en ejecutarse. Si desea crear 20 de estos objetos, es posible que desee retrasar la ejecución hasta que se hayan creado todos, esto le permite paralelizarlos más fácilmente, por ejemplo.Alternativamente, podría ser útil cuando no sabe cuándo será necesario iniciar el objeto, tal vez porque se basa en la entrada del usuario o en la lógica que selecciona de una lista de posibilidades.
Esto supone, por supuesto, que ese
Start()
es el método útil en el objeto, y no un equivalente a unInitialize()
método. Si es solo una forma adicional de establecer más parámetros, no debería existir.fuente
Code Complete (y muchos otros recursos de ingeniería de software) enfatiza la correspondencia de sus clases con objetos del mundo real. Creo que la razón fundamental de esto es que hace que sea más probable que tenga una verdadera comprensión de lo que está implementando, en lugar de atacar una idea intangible.
Si está suscrito a esta teoría, no veo nada de malo en agregar un
Start()
método a cualquier clase que, si fuera un objeto real, también tuviera un estado de reposo. Si no tiene sentido que su objeto exista mientras no se está ejecutando (o no tiene ningún sentido que su objeto se esté ejecutando), entonces diría que es una mala práctica.fuente
Start()
podría corresponder a un interruptor de encendido / apagado (como un interruptor de luz) que luego debería tener unStop()
botón pulsador (como el botón Imprimir en una máquina copiadora) donde se inicia y luego se ejecuta hasta que esté listo.Puede usar la inicialización diferida.
De esta forma, evita el acoplamiento temporal, lo que significa que el consumidor de su clase debe llamar a ciertos métodos en cierto orden. Tener que llamar
start()
primero es una forma de saber cómo funciona internamente la clase, lo cual es malo porque puede cambiar eso en el futuro.Retrasar la costosa inicialización hasta que se necesite por primera vez
Ejemplo:
fuente