Wie OOP Programmablauf organisieren?

suntrop

Erfahrenes Mitglied
Hi!

Ich hänge seit längerer Zeit bei der Objekt Orientierung irgendwie fest. Stoße da immer auf die gleichen Dinge und am Ende wird es "etwas" durcheinander ;-)

Konkret meine ich den Arbeitsablauf innerhalb meiner Klassen. Hier ein Beispiel eines kleinen "Shop-Moduls".
PHP:
<?php
// Die Seite example.com/warenkorb/ startet den Prozess, um ein Produkt in den Warenkorb zu legen
if (!empty($cms->request->post('add_to_cart'))) {
    $cart->addStart();
}

Bevor ein Produkt im Warenkorb landen darf, will ich natürlich einige Dinge prüfen. Ist die Anzahl in Ordnung, ist das Produkt noch vorhanden, darf der Shop-Gast dieses Produkt bestellen, etc.
Ich habe bei so etwas immer wieder das Problem, wie ich das organisiere. Es heißt ja, je method() nur eine spezielle Aufgabe.

Das wäre dann eine Kaskade wie A() ruft B() auf und dann B() ruft C() etc. bis am Ende das Produkt im Warenkorb liegt. Dann geschieht ein Redirect zur Danke-Seite.
PHP:
Class Cart extends Shop {

    // Diese Methode wird als erstes Aufgerufen (s. oben)
    public function addStart() {
        $this->checkQuantity(); // ist Min/Max Menge in Ordnung
        return false;
    }
    // Schritt 2
    public function checkQuantity() {
        if ($quantity < $max && $quantity > $min) {
            $this->checkInStock(); // Dann geht es von hier aus weiter
        }
        return false;
    }
    // Schritt 3
    public function checkInStock() {
        if ($availabe >= $qty_in_basket) {
            $this->addToCart(); // letzte Prüfung, dann zum tatsächlichen Hinzufügen in den Warenkorb
        }
        return false;
    }
    // Schritt 4 (Ende)
    public function addToCart() {
        $product_id = $this->request->post->product_id;
        $cart = $this->getCart();
        $product = $shop->getProduct($product_id);

        $cart->items->add($product);
        $added = $cart->save();

        // if $added == success => redirect example.com/danke/
    }
}

Der Code ist natürlich nur sinnbildlich gemeint, die Prüfungen sind komplexer/länger. Aber ich hätte mich je Methode auf eine Aufgabe beschränkt, was zwar einfach zu verstehen ist, aber ich habe das Gefühl, dass dieser Ablauf in Zukunft eher zu mehr Probleme führen kann.

Deshalb Möglichkeit 2. Hier würde ich nur eine addToCart() Methode haben, die dann zwar viele Aufgaben übernimmt, aber es wäre "schön" alles an einem Ort. Allerdings wird das dann eine recht lange komplexe Methode.
PHP:
Class Cart extends Shop {

    public function addToCart() {
        $continue = $this->checkQuantity();
        if ($continue == false) return false;

        $continue = $this->checkInStock(); // würde bei Fehler false zurückliefen
        if ($continue == false) return false;

        // Mehr Kontrollen, sanitize etc.

        // Wenn es bis hier her ging, dann muss oben/vorher alles in Ordnung sein
        $product_id = $this->request->post->product_id;
        $cart = $this->getCart();
        $product = $shop->getProduct($product_id);

        $cart->items->add($product);
        $added = $cart->save();

        return $added;
    }
}

Auch finde ich immer schwer zu entscheiden, wo ich den Programmablauf abbrechen sollte. So wie hier im zweiten Beispiel ($continue == false) oder schon direkt in den jeweiligen Methoden checkQuantity(), checkInStock()? Also so früh als möglich.

Gibt es dafür ein Design Pattern? Nach welchen konkreten Begrifflichkeit kann ich suchen?

Ich habe z. B. bei Magento, Shopware und Prestashop geguckt. Magento ist alles os zerstreut, das hilft mir nicht weiter. Shopware hat eher recht lange (unverständliche) Methoden und PrestaShop liegt irgendwo zwischen beiden. Lösungen für mich konnte ich aber nicht ableiten.
 
Viele wegen führen nach Rom. Ich würde die addCart Methode in einen try Block packen und in checkQuantity und checkInStock exceptions werfen die dann im Catch Block entsprechend behandelt werden.
 
Zurück