2010-04-24 21 views
7

He leído algunos mensajes sobre las diferencias entre estas 3 relaciones y creo que entiendo el punto.¿cómo se escriben la asociación, la agregación y la composición?

me pregunto, ¿están todos estos escritos igual al codificar?

pregunta 1: ¿todos los 3 son solo un valor del tipo de objeto en una variable de instancia?

class A { 
    public $b = '' 

    public function __construct($object) { 
     $this->b = $object // <-- could be a association, aggregation or a composition relation? 
    } 
} 

pregunta 2: ¿tiene que ser una variable de instancia o puede ser una estática?

class A { 
    public static $b = '' // <-- nothing changed? 

    public function __construct($object) { 
     $this->b = $object 
    } 
} 

pregunta 3: ¿hay alguna diferencia en dónde se crea el objeto?

i tienden a pensar que se crea composición objeto dentro del objeto:

class A { 
    public $b = '' 

    public function __construct() { 
     $this->b = new Object // is created inside the object 
    } 
} 

y agregación/asociación se hace pasar a través de un constructor o otro método:

class A { 
    public $b = '' 

    public function __construct($object) { // passed through a method 
     $this->b = $object 
    } 
} 

pregunta 4: ¿por qué/cuando es importante saber esto ¿Tengo que comentar un objeto dentro de otra relación de qué se trata o lo haces en un diagrama UML?

alguien podría arrojar algo de luz sobre estas preguntas.

gracias!

Respuesta

6

Tiene razón en que normalmente se realizan como referencias a objetos, que por supuesto son generalmente solo campos de miembros de alguna clase. Esto es así porque es natural en un sistema orientado a objetos, esto puede asignarse a otras cosas en diferentes contextos, p. claves externas en una base de datos relacional.

Según lo mencionado por @erisco, los detalles de la relación solo pueden tomarse en el contexto del modelo general. Por ejemplo, podemos leer una relación de composición entre una orden de compra y una línea de pedido como esta (por ejemplo): una orden de compra comprende una o más líneas de pedido.

que suelo interpretar los tres das de la siguiente manera:

  1. Asociación: Una sabe de B, B tiene un significado en su propio derecho.
  2. Agregación: A incluye B, B es externamente identificable y puede existir por sus propios méritos.
  3. Composición: A comprende B, B no es identificable externamente o no tiene significado fuera de esta composición.

Dicho esto, he visto éstos utilizan para significar casi cualquier cosa que pueda ser soñados (y hay gente muy probables en la SO que no estarán de acuerdo con mi evaluación!) Así que tenga cuidado al interpretar de otra persona diagramas: -) Las convenciones anteriores me han servido bien, pero YMMV.

Pregunta 2: Una referencia estática produciría una asociación común entre instancias, pero es solo una forma de implementar eso, y podría ser sorprendente para los consumidores.

+0

por lo que el lenguaje en sí no puede interpretar la relación entre 2 objetos. solo se muestra en el diagrama UML para que nosotros, los programadores, comprendamos cuáles son las relaciones entre esos objetos, ¿verdad? porque me preguntaba si existe una forma específica de codificar estas relaciones, pero parece que no es el caso. ¿Debería escribirse esta relación en el código como un comentario o solo en UML? –

2

Wikipedia: Class Diagrams probablemente tenga sus mejores definiciones. Ninguno de sus ejemplos distingue entre asociación, agregación o composición. Sin ninguna definición de lo que A es, o lo que B es, no hay definición de cuál es su relación. Cómo se obtiene la referencia al otro objeto es irrelevante para los diagramas de clase.

0

Como clearly stated en php.net:

Un Asociación es una composición de las piezas construidas de forma independiente y externamente visibles. Cuando asociamos clases u objetos, cada uno guarda una referencia a los que está asociado.

Cuando asociamos las clases estáticamente, una clase contendrá una referencia a una instancia de la otra clase.

También podemos asociar instancias en tiempo de ejecución por pasando una referencia en un constructor (o cualquier otro método), lo que nos permite cambiar dinámicamente la relación de asociación entre los objetos.

Cuestiones relacionadas