¿Es correcto invocar métodos en el constructor de un objeto?

publicado por: Anonymous

Estoy programando orientado a objetos en PHP y me surge la siguiente duda:
¿Desde un método constructor podríamos llamar a métodos de la misma clase para realizar otras acciones al mismo tiempo que construimos al objeto o estaríamos incurriendo en una mala práctica?

Os dejo el código para que me digáis que sería lo más correcto:

class Articulo
{

    protected $id;
    protected $nombre;
    protected $fechaCreacion;
    protected $tipo;


    public function __construct($nombre, $fechaCreacion, $tipo)
    {
        $this->id=$this->generarId($fechaCreacion);
        $this->nombre=$nombre;
        $this->fechaCreacion=$fechaCreacion;
        $this->tipo=$tipo;
        //$this->guarda() //para que al mismo tiempo que da valor a las propiedades del objeto haga la acción de guardar

    }


    public function generarId($fechaCreacion)
    {
        return 'A-'.$fechaCreacion;
    }

    public function guarda(){

        $file=fopen("archivo.txt","w");
        fwrite($file, "ID -> ".$this->id.PHP_EOL);
        fwrite($file, "FechaCreacion ->".$this->fechaCreacion.PHP_EOL);
        fclose($file);
    }

}


$articulo=new Articulo('articulo', time(), 'objeto');
//$articulo->guarda() //para que haga la acción de guardar después de crear el objeto.

La misma duda la tengo con el método generarId, que no se si lo correcto es generar la id en el constructor o llamar después a un método “setId” para que le asigne el valor que le corresponde.

solución

Lo mejor seria delegar la ejecucion de los metodos al usuario principalmente porque no sabes las veces que tendrás que llamar el constructor de la clase. En escenario donde necesites crear multiples instancias de la clase(por ejemplo obteniendo registros de la base de datos), se tendria que crear un archivo por cada instancia y eso haria el proceso mas lento.

Si se delega la ejecucion del metodo al usuario, entonces se crearia el archivo por demanda lo que haria la aplicacion mucho mas rapido.

En otras palabras, no pongas la ejecucion del metodo guardar en el constructor, sino deja que el usuario(programador) lo ejecute:

class Articulo
{
   //..

    public function __construct($nombre, $fechaCreacion, $tipo)
    {
       //...
        $this->guarda() // esto no, es muy lento crear una instancia
    }
    //...
}

Sino, hacerla asi:

class Articulo
{
   //..

    public function __construct($nombre, $fechaCreacion, $tipo)
    {
       //...

    }
    //...
}
$articulo = new Articulo("nombre", "fecha", "tipo");
$articulo->guardar();

Dale una mirada al patron de inicializacion perezoza(lazy loading) que puede arrojarte mas luz sobre el tema.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *