Frage

Nach dem Gesetz von Demeter können Sie Methoden auf zurückgegebenen Objekte nennen?

z.

<?php
class O
{
    public function m($http)
    {
        $response = $http->get('http://www.google.com');
        return $response->getBody(); // violation?
    }
}
?>

$ http-> get () gibt ein Objekt zurück. Enthält diese Zählung als ein Objekt erstellt / instanziiert in M? Wenn Sie diese Methoden nicht auf sie anrufen können (nach LoD), wie würden Sie mit dieser Situation umgehen?

War es hilfreich?

Lösung

Dies ist kein Verstoß gegen das Gesetz von Demeter, gegeben :

  

Formal das Gesetz von Demeter für   Funktionen erfordern, dass ein Verfahren M von   ein Objekt O nur aufrufen kann,   Methoden der folgenden Arten von   Objekte:

     
      
  • O selbst
  •   
  • M-Parameter
  •   
  • alle Objekte erstellt / instanziiert innerhalb M
  •   
  • O direkte Komponente Objekte
  •   
  • eine globale Variable, mit dem O, im Rahmen von M
  •   

Da $ response ein Objekt, das in M ??erstellt haben, können Sie eine Methode auf das Objekt ohne Verletzung berufen. Allerdings wäre es eine Verletzung zu Zugriffseigenschaften über getBody() sein:

$length = $response->getBody()->length;

Manchmal kann man sagen, dass das Gesetz mit den Worten vereinfacht werden kann es die Regel „ein Punkt“, was bedeutet, dass Sie tief eine Eigenschaft oder Methode zugreifen können.

Andere Tipps

Auf der einen Seite scheint $response wurde innerhalb Methode m geschaffen zu haben, so die Antwort ja zu sein scheint.

Auf der anderen Seite, da $http hat zu m verabschiedet worden, das Objekt durch $http->get() zurückgegeben, die jetzt von $response könnte sein, ein Mitglied der $http dargestellt wird, die m vor dem Eintritt erstellt worden sein könnte.

In Anbetracht der „nur ein Punkt“ (oder, in diesem Fall Pfeil) Auslegung des Gesetzes, Umschreiben der Körper Ihrer Funktion als return $http->get('http://www.google.com')->getBody(); legt nahe, dass es sich um eine Verletzung sein könnte. Speichern der Zwischenelemente als lokale Variablen scheint wie eine zweifelhafte Art und Weise die Ein-Punkt-Prinzip zu vermeiden.

Ich kann keine definitive Antwort geben. Bis zu einem gewissen Grad, ich denke, es hängt davon ab, wie viel Vertrauen Sie den $http->get(), um Ihnen eine neu erstellte Objekt anstelle eines vorbestehenden Mitglied.

Eine Möglichkeit, dies zu lösen, ist das Objekt innerhalb m () zu erstellen, und lassen Sie http-> get () füllen sie mit Informationen.

class O
{
    public function m($http)
    {
        $response = new HttpResponse();
        $http->get('http://www.google.com', & $response);
        return $response->getBody(); // no violation, since we made $response ourselves.
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top