Symmetrische Collection

Analog zur has()-Methode lagern wir auch den schreibenden Zugriff auf $items aus. Dabei gibt es ein kleines Problem mit der Namensgebung, aber das kriegen wir gelöst.

Und wenn wir gerade dabei sind, führen wir auch gleich die vorhin erwähnte Guard Clause mit ein:

<?php declare(strict_types=1);

namespace spriebsch\tfd\cleanCode\singleLevelOfAbstraction\balancedCollection;

use RuntimeException;

final class SomeCollection
{
    private array $items = [];

    public function has(string $id): bool
    {
        return isset($this->items[$id]);
    }

    public function add(SomeObject $object): void
    {
        $this->ensureNotInCollection($object);

        $this->addToCollection($object);
    }

    private function ensureNotInCollection(SomeObject $object): void
    {
        if ($this->has($object->id())) {
            throw new RuntimeException(sprintf('Duplicate id %s', $object->id()));
        }
    }

    private function addToCollection(SomeObject $object): void
    {
        $this->items[$object->id()] = $object;
    }
}
SomeCollection.php

Das ist jetzt gut lesbarer Code. Eine umgedrehte Pyramide, bei der wir als Leser entscheiden können, ob wir nur die öffentlichen Methoden anschauen oder weiter lesen und uns auch dafür interessieren, wie das Ganze im Detail gemacht wird.

Und wir haben in jeder Methode genau eine Abstraktionsebene!