Moin!
Hat es Sinn, sich der Sache anzunehmen oder sollte ich dem Auftraggeber meine Erkenntnisse mitteilen und ihn an den Ersteller des Shops verweisen (ich tendiere zu Letzterem)?
Tja, es KÖNNTE sein, dass du mit einer relativ simplen Caching-Methode, die bereits gelesene Querys direkt aus dem Speicher bedient, mit Glück angewandt auf die einzige zentrale DB-Zugriffs-Klasse, die es hoffentlich gibt, auf einen Schlag die mangelhafte OOP-Umsetzung in eine RAM-fressende, aber zunächst mal deutlich performantere Form bringst.
Wenn an dieser Stelle dein Auftrag durch Auszahlung des vereinbarten Salärs beendet ist, könntest du drüber nachdenken. Vereinbare aber unbedingt, dass man dich danach nicht mehr kontaktieren darf, bzw. du zumindest Folgeaufträge nicht annehmen musst. Denn so wie es aussieht, ist der Code schon übel verknotet, und das wird durch den Cache-Einbau natürlich nicht besser, sondern schlimmer. Denn im Prinzip ist das genau der falsche Ansatz an dieser Stelle.
So wie's aussieht, hat der Shop-Hersteller halt sämtliche Abfragen von Objekteigenschaften, die in der Datenbank gespeichert vorliegen, 1:1 als DB-Query realisiert. Du willst den Namen eines Artikels wissen? 'SELECT name FROM articles WHERE articleId = "Die ID vom Objekt"'. Du willst dann noch den Preis des Artikels wissen? 'SELECT price FROM articles WHERE articleId = "Die ID vom Objekt"'. Warum mit einem Query direkt ALLE Eigenschaften des Artikels abfragen und zwischenspeichern, wenn man doch gar nicht weiß, ob diese Eigenschaften immer alle gebraucht werden - da spart man richtig viel Speicherplatz, wenn man das alles On-Demand macht!
Und vor allem: Mit OOP kann man diese Tatsache, dass die grundlegenden Objekte, die Einträge der DB repräsentieren, bei jeder Eigenschaftsabfrage ein Query lostreten, wunderbar verstecken und wegabstrahieren. Und man wundert sich dann, warum eine Doppelschleife "foreach ($warenkorb as $articles) { foreach ($articles as $eigenschaft)...}
" plötzlich exponentiell viele Querys erzeugt...
OOP ist eine gute Antwort auf viele Herausforderungen der Programmiererei - AUCH UND GERADE BEI PHP - aber es bedeutet nicht, dass man nur "irgendwie" OOP machen muss, und schon wird automatisch alles prima. Natürlich nicht. Man muss schon genau planen, wo man die teuren DB-Zugriffe platziert, und man muss solche Aufrufe auch sehr bewußt in anderen Codeteilen starten - und nicht wegabstrahiert in einem $article->getPrice() oder $article->getName() verstecken (noch schlimmer, wenn sowas in den magischen Methoden __get/__set oder __call versteckt sein sollte - aber da wäre wenigstens ein, wenn auch sehr gefährlich zu ändernder, zentraler Anlaufpunkt, um global besseres Verhalten beizubringen).
- Sven Rautenberg