Rolf B: Softwarepattern für Kumulierung aus einer Liste gesucht

Beitrag lesen

Hallo T-Rex,

einfacher sicher - aber ob schneller?

Möglichkeiten gips genug.

class ValueList
{
   private $values;

   private function summiere1($getterName) {
   {
      $summe = 0;
      foreach ($this->values as $v)
      {
         $summe += $v->$getterName();
      }
      return $summe;
   }

   public function getSumme1() 
   {
      return summiere("getZahl1");
   }

   public function getSumme2() 
   {
      return array_reduce($this->values, 
                          fn($summe, $val) => $summe + $val->getZahl2(),
                          0);
   }
}

getSumme1 verwendet die private summiere Funktion, die den Getter per Name aufruft. Ja, tatsächlich, geht: $this->$getter() ruft die Methode auf, deren Name in $getter steht.

getSumme2 verwendet array_reduce, statt die Schleife selbst zu bilden. Die array_reduce Funktion erwartet als zweiten Parameter ein callable-Objekt, was in PHP viele Formen annehmen kann:

  • Name einer globalen Funktion
  • Ein Array aus Objekt und Funktionsname
  • Eine anonyme Funktion: function($s, $v) { return $s + $v->getZahl2(); }
  • Eine Pfeilfunktion: fn($s, $v) => $s + $v->getZahl2(),

Pfeilfunktionen (anderswo auch Lambda-Ausdruck genannt) sind die Kurzform einer anonymen Funktion, wenn diese nichts weiter tut als einen Ausdruck auszuwerten und das Ergebnis zurückzugeben. Sie haben auch den zusätzlichen Vorteil, automatisch Variablen des Scope, in dem sie definiert werden, in eine Closure aufzunehmen, ohne dass man dafür mit use herumbasteln muss.

PHP hat da ein paar nette funktionale Elemente von von JavaScript und anderen Sprachen abgeguckt.

Ob der Aufruf über Name oder per Pfeilfunktion schneller ist, müsste man messen. Aber es kann nicht viel ausmachen.

Rolf

--
sumpsi - posui - obstruxi