Ejemplo de composición: Factura y detalle de factura

Este es un ejemplo publicado a partir de la duda de un usuario, y como son preguntas que se hacen reiteradamente, les dejo el ejemplo aquí (cualquier duda la discutimos en los comentarios de este post):

La relación debería ser "composición" (no tiene sentido la existencia de "detalle" sin la relación con factura, por lo tanto es una "relación de vida" entre ambas clases) y el diagrama UML sería el siguiente:



y la traducción a código sería:

Factura.php

Código PHP:
require_once 'FacturaDetalle.php';

class 
Factura 

{
   private 
$_colDetalle = array();

   public function 
addDetalle(FacturaDetalle $detalle)
   {
      
$this->_colDetalle[] = $detalle;
   }
FacturaDetalle.php
Código PHP:
class FacturaDetalle 
{
   
/** código de la clase **/ 

Forma de uso: index.php

Código PHP:
require_once 'Factura.php';
require_once 
'FacturaDetalle.php';

abstract 
Index
{
   public static function 
main()
   {
      
$factura = new Factura();

      
// Agrego 4 detalles a la factura

      
$factura->addDetalle(new FacturaDetalle());
      
$factura->addDetalle(new FacturaDetalle());
      
$factura->addDetalle(new FacturaDetalle());
      
$factura->addDetalle(new FacturaDetalle());
   }
}
Index::main(); 
Más información sobre el tema de diagramas y traducción de relaciones

Saludos!

7 comentarios:

StraTDeS dijo...

Hola,

Qué aplicación has utilizado para hacer ese diagrama UML tan simpático? Me ha encantado ;)

Saludos

Enrique Place dijo...

Que tal StraTDeS ;-)

Ahh... cierto, es otro servicio web ;-)

Visita http://yuml.me/ y luego me cuentas ;-)

Ali Lozano dijo...

Me gusta como has puesto un código limpio.. y fácil de entender xD..

Deberías explicar las diferencias entre composición y agregación, es lo único que le falta al articulo, o eso creo.

Natán dijo...

Sin desmerecer la prolijidad del ejemplo, venía a preguntar con qué hiciste el diagrama :-)

Voy a estar probandolo, gracias!

Martin dijo...

Por qué haces referencia (require_once) a FacturaDetalle en el index? Conceptualmente la clase index usa la clase Factura (que tiene una relación de agregación con FacturaDetalle), o me estoy perdiendo algo?
Saludos!

Unknown dijo...

Tincho: Las clases deben tener sus propias relaciones así sea que otra clase las invoque como en el caso de index. ademas require_once solo "cargará" la Clase una vez.

hardy heron dijo...

Buenas Enrique, veo que volviste a forosdelweb, seguí muy de cerca el percanse que tuviste con ellos, me dá gusto que hayas vuelto :D aunque nunca entro a Foros del web :P

Entradas populares