Beispiel: Collection
Stellen wir uns eine Collection von irgendwelchen Objekten vor. Diese Objekte selbst sind für unser Beispiel relativ egal, sie haben aber eine ID:
<?php declare(strict_types=1);
namespace spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection;
final readonly class SomeObject
{
public function __construct(
private string $id
) {}
public function id(): string
{
return $this->id;
}
}
SomeObject.php
Wir können diese Objekte zu unserer Collection hinzufügen. Da wir sicherstellen wollen, dass identische Objekte nur einmal in der Collection landen, machen wir eine entsprechende Prüfung, bevor wir das Objekt in die Collection aufnehmen:
<?php declare(strict_types=1);
namespace spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection;
use RuntimeException;
final class SomeCollection
{
private array $items = [];
public function add(SomeObject $object): void
{
if (isset($this->items[$object->id()])) {
throw new RuntimeException(sprintf('Duplicate id %s', $object->id()));
}
$this->items[$object->id()] = $object;
}
}
SomeCollection.php
Einmal ein Objekt hinzufügen sollte also funktionieren:
<?php declare(strict_types=1);
namespace spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection;
require __DIR__ . '/autoload.php';
$collection = new SomeCollection;
$collection->add(new SomeObject('the-id'));
var_dump($collection);
example.php
example.php:10: class spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection\SomeCollection#2 (1) { private array $items => array(1) { 'the-id' => class spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection\SomeObject#3 (1) { private readonly string $id => string(6) "the-id" } } }
Ausgabe von example.php
example.php ausführen
Zweimal das identische Objekt zur Collection hinzufügen funktioniert dagegen nicht:
<?php declare(strict_types=1);
namespace spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection;
require __DIR__ . '/autoload.php';
$object = new SomeObject('the-id');
$collection = new SomeCollection;
$collection->add($object);
$collection->add($object);
example-will-fail.php
PHP Fatal error: Uncaught RuntimeException: Duplicate id the-id in SomeCollection.php:14 Stack trace: #0 example-will-fail.php(11): spriebsch\tfd\cleanCode\singleLevelOfAbstraction\collection\SomeCollection->add() #1 {main} thrown in SomeCollection.php on line 14
Ausgabe von example-will-fail.php
example-will-fail.php ausführen