Realmente no soy el indicado como para decir que algo esta mal o esta bien, pero me encontré con algo (un articulo específicamente xD ) que realmente se contradice en algunas cosas y no realiza un buen ejemplo.
Primero voy a explicar que entiendo yo por Composición y luego entro a analizar el artículo.
Relación entre distintas capas. Composición según Dario Ocles XDSi me baso en una definición ya hecha sería la siguiente:
El tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye.
Entonces entendemos que un objeto incluye a otro, pero la vida del incluido es condicionada por la vida del objeto que lo incluye (es obvio esto, pero debía decirlo).
Este sería un ejemplo de dicha relación:
class Cuenta{
private $numero = '';
public function __construct($numero){
$this->numero = $numero;
}
public function getNumero(){ return $this->numero;}
}
class Banco{
private $nombre = '';
private $direccion = '';
private $cuentas = array();
public function __construct($nombre,$direccion){
$this->nombre = $nombre;
$this->direccion = $direccion;
}
public function agregarCuenta($numeroDeCuenta){
$this->cuentas[] = new Cuenta($numeroDeCuenta);
}
}
$banco = new Banco('Nacion', 'Lejos de aca');
$banco->agregarCuenta(123);
$banco->agregarCuenta(1234);
$banco->agregarCuenta(12345);
Perdonen la falta de indentación, pero éste bendito WYSIWYG me gano.La relación se puede verificar por el simple hecho que si muere la instancia de la clase Banco, en este caso la variable $banco, todas las instancias de Cuenta relacionadas con la instancia anterior muren también.
Composición según el articuloEl articulo en concreto es
éste y lo descubrí gracias a
éste thread dentro de ForosDelWeb (Allí también se discute sobre esto).
Lo primero que debo decir es que ya lleva algún tiempo largo colgado en la red (tiene fecha de
11-07-2005). Lo segundo que puedo decir... en realidad no voy a decir voy a citar una frase de allí:
It occurs when an object creates another object; that is, the first object completely possesses the second object.
Traducido sería algo así (no doy fe sobre la traducción ya que no soy muy bueno en esto):
Esto ocurre (N.T: la Composición) cuando un objeto crea otro; es decir, el primer objeto posee completamente al segundo objeto.
En la segunda página sobre éste tema también dice algo así:
Composition happens when one object directly creates a second object. This means that the original object is responsible for the “birth” of the second.
Traducido sería algo así:
La Composición ocurre cuando un objeto de forma directa crea a un segundo objeto. De esta manera el objeto original es responsable del "nacimiento" del segundo.
Ahora si analizamos el código del ejemplo (
esta aquí) podemos asegurar lo siguiente (obviamente también tenemos que leer el articulo completo):
- La clase Page es la que incluye a la clase Table.
- En teoría si muere Page muere Table.
Ahora yo hice la siguiente prueba: Si ejecuto lo siguiente demuestro que la Composición no está bien aplicada... o por lo menos lo que yo entiendo por Composición.
$page=&new Page();
$page->makeHeader('Header
');
$table=$page->makeBody(range(0,20));
$table->setId('maincontent');
$table->build('#ffcc00','#eeeeee');
$page->makeFooter('Footer
');
unset($page);
echo '';
var_dump($table);
echo '
';
En éste caso muere Page pero Table ni siquiera se "entera" esto va en contra totalmente sobre lo que hablamos de Composición o por lo menos va en contra de la teoría que aquí se expuso.
Lo que no termino de entender es el porque de este ejemplo mal hecho pero sospecho que se debe a lo siguiente.
En la clase Page se declara un metodo makeBody() de la siguiente manera:
function makeBody($content=array()){
return new Table($this,$content);
}
Y en todo caso sí se hace eso hay una relación de uso (línea punteada)... pero hay otra cosa "rara" y es que en la clase Table el constructor es definido de la siguiente manera:
function Table(&$page,$content){
$this->page=&$page;
$this->content=$content;
$this->id='defaultID';
}
La propiedad page de la clase Table termina siendo un tipo de "puntero" de C... si el objeto cambia fuera del objeto Table también lo hace la propiedad dentro de Table (actuando así como un puntero) pero aún así si muere Page de ninguna manera muere Table (cosa necesaria para considerarse una relación de Composición).
Espero que esto sirva de algo a alguién y cualquier duda, consulta, queja o corrección son bienvenidas.
DarioDario.