Question

Selon le loi de Déméter, vous pouvez appeler des méthodes sur les objets retournés?

par exemple.

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

$ de type HTTP> get () retourne un objet. Est-ce que ce compte comme un objet créé / instancié au sein de M? Si vous ne pouvez pas appeler des méthodes sur elle (selon LOD), comment voulez-vous gérer cette situation?

Était-ce utile?

La solution

Ce n'est pas une violation de la loi de Déméter, donné :

  

Plus formellement, la loi de Déméter pour   fonctions exige qu'une méthode de M   un objet O ne peut invoquer la   méthodes des types de suivants   objets:

     
      
  • O lui-même
  •   
  • Paramètres de M
  •   
  • aucun objet créé / instanciée à l'intérieur de M
  •   
  • O objets de composants directs
  •   
  • une variable globale, accessible par O, dans le cadre de M
  •   

Depuis $ response est un objet qui est créé au sein de M, vous pouvez invoquer une méthode sur cet objet sans violation. Cependant, ce serait une violation d'accès au-delà des propriétés getBody():

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

Parfois, vous pouvez dire que la loi peut être simplifiée en disant que c'est la règle « un point », ce qui signifie que vous pouvez accéder à une propriété ou une méthode profonde.

Autres conseils

D'une part, $response semble avoir été créé au sein de la méthode m, donc la réponse semble être oui.

Par contre, depuis $http a été adoptée pour m, l'objet retourné par $http->get() qui est maintenant représentée par $response pourrait être un membre de $http qui aurait pu être créé avant l'entrée à m.

Compte tenu de la « seul point » (ou, dans ce cas flèche) interprétation de la loi, la réécriture du corps de votre fonction return $http->get('http://www.google.com')->getBody(); suggère qu'il pourrait être une violation. Enregistrement des membres intermédiaires comme des variables locales apparaît comme un moyen d'éviter le mal famé principe d'un point.

Je ne peux pas donner une réponse définitive. Dans une certaine mesure, je pense que cela dépend de combien vous faites confiance au $http->get() pour vous donner un objet nouvellement créé au lieu d'un membre préexistant.

Une possibilité de résoudre ce problème est de créer l'objet dans m (), et de laisser de type HTTP> get () remplir des informations.

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.
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top