PHP OOP: Kompozice a agregace (Composition and Aggregation) [11]

PHP OOP: Kompozice a agregace (Composition and Aggregation) [11]

Kompozice (composition, složení) je v OOP způsob, jak kombinovat základní objekty či data do složitějších (ve složené objekty, v celky, vztahy mezi objekty). Tyto složené objekty je pak možné používat stejně jako základní objekty. Zásadní je, že kompozitní objekty nemají nezávislou existenci viz níže příklad kompozice  = objekt Person nemůže existovat bez objektu AddressBook.

Jinak řečeno - složené objekty jsou součástí jen jediného objektu a existence mimo tento kompozit není možná.

 

Kompozice vs agregace

Oproti kompozici agregace znamená, že jde o volnou vazbu mezi objekty = objekty mají nezávislou existenci viz níže příklad agregace  = objekt Person může existovat bez objektu AddressBook.

Jinak řečeno - objekt má jiné objekty jen jako části, ty mohou být součástí více objektů a existence mimo agregát je možná.

 

Kompozice vs dědičnost

Jak jsme si již uvedli v jedné lekci - dědičnost se používá k rozšiřování existujících tříd (nová třída vzniklá na základě staré) = vhodné když nová třída má stejné vlastnosti jako již existující třída a zároveň od ní chceme něco navíc. Jedná se o vztah is a (A is a B).

Kompozice se zase používá, když objekt obsahuje více jiných objektů. Jedná se o vztah has a (A has a B).

Obecně se má spíše dát přednost kompozici před dědičností.

 

Příklad kompozice v OOP

https://github.com/hydroxid/php_examples/blob/main/3686_composition_and_aggregation/composition.php

class Person
{
   private $name;
   private $address;

   public function __construct(string $name, string $address)
   {
        $this->name = $name;
        $this->address = $address;
   }

   public function getName()
   {
        return $this->name;
   }

   public function getAddress()
   {
        return $this->address;
   }
}

class AddressBook {
    private $persons = [];
    private $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    // difference from aggregation example
    public function addPerson($name, $address)
    {
        // difference from aggregation example
        $this->persons[] = new Person($name, $address);
    }

    public function getPersons()
    {
        return $this->persons;
    }
}

$addressBook = new AddressBook('My address book (with composition)');
// difference from aggregation example
$addressBook->addPerson('Tom', 'Street 7, Town 34237');
$addressBook->addPerson('John', 'Street 3, Small Town 43564');
$addressBook->addPerson('Doe', 'Street 88, Big City 33664');

echo $addressBook->getName() . PHP_EOL;
foreach ($addressBook->getPersons() as $person) {
    echo $person->getName() . PHP_EOL;
    echo $person->getAddress() . PHP_EOL;
}

 

 

Příklad agregace v OOP

https://github.com/hydroxid/php_examples/blob/main/3686_composition_and_aggregation/aggregation.php

class Person
{
   private $name;
   private $address;

   public function __construct(string $name, string $address)
   {
        $this->name = $name;
        $this->address = $address;
   }

   public function getName()
   {
        return $this->name;
   }

   public function getAddress()
   {
        return $this->address;
   }
}

class AddressBook {
    private $persons = [];
    private $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    // difference from composition example
    public function addPerson($person)
    {
        // difference from composition example
        $this->persons[] = $person;
    }

    public function getPersons()
    {
        return $this->persons;
    }
}

$addressBook = new AddressBook('My address book (with aggregation)');
// difference from composition example
$addressBook->addPerson(new Person('Tom', 'Street 7, Town 34237'));
$addressBook->addPerson(new Person('John', 'Street 3, Small Town 43564'));
$addressBook->addPerson(new Person('Doe', 'Street 88, Big City 33664'));

echo $addressBook->getName() . PHP_EOL;
foreach ($addressBook->getPersons() as $person) {
    echo $person->getName() . PHP_EOL;
    echo $person->getAddress() . PHP_EOL;
}

 

 

 

Související obsah

serial-php-oop

php

programovani

vyvoj

php-oop

Komentáře

Vaše reakce na PHP OOP: Kompozice a agregace (Composition and Aggregation) [11]

Reference

Podívejte se na naše reference

Prohlédnout

Aplikace

Podívejte se na naše aplikace

Prohlédnout

Co umíme?

Podívejte se co umíme

Prohlédnout

Co umíme?

Vytváříme sofistikované aplikace pro náročné

Od webových aplikací přes android až po převodové můstky či složité informační systémy.

Podívejte se k nám

Máte ještě čas? Podívejte se na další rubriky

Tento web používá soubory cookie. Dalším procházením tohoto webu vyjadřujete souhlas s jejich používáním.. Více informací zde.