Questo è un esempio di composizione o aggregazione? [duplicare]

3

La composizione e l'aggregazione sono entrambi per me fonte di confusione. Il mio codice di esempio qui sotto indica composizione o aggregazione?

class A {
     public static function getData($id) {
         //something
     }

     public static function checkUrl($url) {
         // something
     }

 class B {
    public function executePatch() {
           $data = A::getData(12); 
     }

    public function readUrl() {
           $url = A::checkUrl('http/erere.com');
     }

    public function storeData() {
            //something not related to class A at all
     }
  }
}

La classe B è una composizione di classe A o è aggregazione di classe A? La composizione significa semplicemente che se la classe A viene cancellata la classe B non funziona affatto e l'aggregazione se la classe A ottiene i metodi cancellati nella classe B che non usano la classe A funzionerà?

    
posta meWantToLearn 24.10.2012 - 14:53
fonte

3 risposte

3

La pagina di Wikipedia su composizione oggetto potrebbe essere un buon punto di partenza. L'aggregazione è una forma più generale di composizione, o la composizione è una forma più strong di aggregazione. La composizione è effettivamente una relazione di proprietà, mentre l'aggregazione è una relazione "contiene". Nella composizione, le parti non possono esistere al di fuori della cosa che li contiene, ma le singole cose possono esistere da sole come entità uniche nell'aggregazione.

Il tuo codice non è un esempio di aggregazione o composizione. La tua classe B non contiene un'istanza di classe A . Inoltre, non c'è modo di dire se la classe A può o non può esistere senza un'istanza di classe B . Sembra che il tuo esempio di codice indichi che la classe B dipende dalla classe A , ma questa è una delle forme più deboli di relazione tra due classi in quanto è tra le meno descrittive di come sono strutturalmente correlate.

    
risposta data 24.10.2012 - 15:02
fonte
2

In PHP 5.4 è stato introdotto un meccanismo aggiuntivo che consente la composizione chiamata "tratti", quindi il tuo esempio potrebbe essere qualcosa di simile

trait A {
  public static function getData($id) {
    //something
  }

  public static function checkUrl($url) {
    // something
  }
}

class B {
  use A;
}

Non puoi istanziare il tratto così

$a = new A();

non funzionerebbe e puoi usare diversi tratti all'interno di una classe

    
risposta data 17.11.2012 - 01:17
fonte
1

Ciò che hai codificato ha reso B una classe interiore di A.

Questo ti permetterebbe di finire con una composizione, dato che un oggetto di classe A non può essere creato senza un oggetto di classe B.

class A {
  private B _myObject;
  public constructor( B someObject ) {
    this._myObject = someObject;
  }
}

anche questo

class A {
  private B _object;

  public constructor() {
    this._object = new B();    
  }
}

La differenza tra composizione e aggregazione è che un oggetto di una classe, che aggrega gli oggetti di un'altra classe, può esistere senza quegli altri oggetti di classe.

Un oggetto di una classe, che è una composizione di oggetti di altre classi, non può esistere senza gli altri oggetti di classe.

    
risposta data 24.10.2012 - 15:00
fonte

Leggi altre domande sui tag