2010-06-09 8 views
5

Können Sie nach der Law of Demeter Methoden für zurückgegebene Objekte aufrufen?Gesetz der Demeter und Rückgabewerte

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. Zählt das als ein Objekt, das in M ​​erstellt/instanziiert wurde? Wenn Sie keine Methoden dazu aufrufen können (wie bei LoD), wie würden Sie mit dieser Situation umgehen? Diese

Antwort

6

ist kein Verstoß gegen das Gesetz von Demeter, given:

formal das Gesetz von Demeter für Funktionen erfordert, dass ein Verfahren M von ein Objekt O nur aufrufen kann die Methoden die folgenden Arten von Objekte:

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

Da $ Antwort ist ein Objekt, das innerhalb erstellt wird M, können Sie eine Methode für dieses Objekt ohne Verletzung aufrufen. 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, es ist die „ein Punkt“ Regel vereinfacht werden kann, was bedeutet, dass Sie tief eine Eigenschaft oder Methode zugreifen können .

+0

Mit Ausnahme der Punktoperator in PHP zum Verketten von Strings. :-) Leichtes Brainfart in diesem letzten '.length'-Bit, denke ich. – janmoesen

+0

ruft (wie ein Getter) – nemenems

6

Auf der einen Seite scheint $response in Methode m erstellt worden zu sein, so dass die Antwort ja zu sein scheint.

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

In Anbetracht der "nur ein Punkt" (oder in diesem Fall Pfeil) Interpretation des Gesetzes, Neuschreiben des Körpers Ihrer Funktion als return $http->get('http://www.google.com')->getBody(); schlägt vor, dass es eine Verletzung sein könnte. Die Zwischenglieder als lokale Variablen zu speichern, scheint eine zwiespältige Möglichkeit zu sein, das Ein-Punkt-Prinzip zu vermeiden.

Ich kann keine definitive Antwort geben. Bis zu einem gewissen Grad, denke ich, hängt es davon ab, wie sehr Sie der $http->get() vertrauen, Ihnen ein neu erstelltes Objekt und nicht ein bereits existierendes Mitglied zu geben.

+1

Es ist eine Verletzung. – danidacar

1

Eine Möglichkeit, dies zu lösen, besteht darin, das Objekt innerhalb von m() zu erstellen und http-> get() mit Informationen zu füllen.

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. 
    } 
} 
Verwandte Themen