(Zu) viele Parameter

oop clean code parameter

Oft entwirft man Methoden, die viele Parameter benötigen. Nachdem noch 1-2 Features zu der Klasse hinzugefügt wurden, stellt man dann fest, dass es eindeutig zu viele Parameter geworden sind. Folgende Methode dient uns als Beispiel:

public function send(
    $fromStreet, $fromPostalCode, $fromCity, $fromCountry,
    $toStreet,   $toPostalCode,   $toCity,   $toCountry
) {
    //..
}

Das mag bei der Definition noch einigermaßen übersichtlich sein, doch spätestens bei der Nutzung der Methode geht die Übersicht verloren (und das obwohl die Reihenfolge der Parameter sich hier einfach ableiten lässt):

$obj->send('Musterstraße 74', '22041', 'Hamburg', 'Deutschland', 'Musterweg 42', '8471', 'Leibnitz', 'Österreich');

Um den Code lesbarer zu machen, kann man natürlich lokale Variablen nutzen:

$fromStreet     = 'Musterstraße 74';
$fromPostalCode = '22041';
//...
$toCountry      = 'Österreich';
$obj->send($fromStreet, $fromPostalCode, $fromCity, $fromCountry, $toStreet, $toPostalCode, $toCity, $toCountry);

Dies schafft Übersicht, allerdings gibt es keine Gewährleistung, dass alle Programmierer sich daran halten werden. Für eine konsequentere Schreibweise kann man die einzelnen Parameter vorher mit einzelnen Methoden setzen:

$obj->setReceiverStreet('Musterstraße 74');
$obj->setReceiverPostalCode('22041');
//...
$obj->setSenderCountry('Österreich');
$obj->send();

Dadurch werden alle Programmierer gezwungen, eine gut lesbare API zu nutzen. Die Nachteile sind allerdings klar: Die gesetzten Werte haben eine andere Lebensdauer als die übrigen Eigenschaften, denn nach der Nutzung der send-Methode werden sie nicht mehr benötigt. Zudem gibt es keine Garantie, dass alle Werte gesetzt wurden.

Gerade die gleiche Lebensdauer der Werte können wir uns aber zunutze machen. Statt vieler einzelner Parameter bedienen wir uns eines Parameterobjektes:

//Methodendefinition
public function send(Address $sender, Address $receiver)
{
    if (!$sender->isValid()
        || !$receiver->isValid()
    ) {
        throw new Exception('invalid address given');
    }
    //...
}

//Methodenaufruf
$sender = new Address();
$sender->setStreet('Musterstraße 74');
//....
$receiver->setCountry('Österreich');
$obj->send($sender, $receiver);

Die Vorteile von Parameterobjekten liegen klar auf der Hand:

  • Durch die kleinen Objekte bekommt man eine hohe Wiederverwendbarkeit.
  • Die Parameterobjekte gewährleisten gut lesbaren Code.
  • Die Validierung der Daten erfolgt zentral.

Parameterobjekte sind eine gute Möglichkeit, lange Parameterlisten zu verkürzen. Sie verbessern die Lesbarkeit und bieten sich gleichzeitig als Container für die zugehörige Logik an. Ihr einziger Nachteil – der erhöhte Speicherbedarf durch die zusätzlichen Objekten – hält sich in Grenzen und lässt sich gut verschmerzen.

Ein Gedanke zu „(Zu) viele Parameter“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *