2016-09-29 4 views
0
class Point 
{ 
    private $x, $y; 

    public __construction ($x, $y) 
    { 
     $this->x = $x; 
     $this->y = $y; 
    } 

    public function getX() 
    { 
     return $this->x; 
    } 

    public function getY() 
    { 
     return $this->y; 
    } 
} 

d'abord je voudrais écrire ceci:Pourquoi est préférable d'envelopper (et plusieurs) code pour l'amour de la loi de Demeter?

class Item 
{ 
    private $point; // Point 

    public __construction() 
    { 
     $this->point = new Point(0,0); 
    } 

    public function getPoint() 
    { 
     return $this->point; 
    } 
} 

puis:

$p = new Item(); 
$p->getPoint()->getX(); 

mais ils disent qu'il viole cette loi. Après refactoring:

class Item 
{ 
    private $point; // Point 

    public __construction() 
    { 
     $this->point = new Point(0,0); 
    } 

    public function getPointX() 
    { 
     return $this->point->getX(); 
    } 

    public function getPointY() 
    { 
     return $this->point->getY(); 
    } 
} 

puis:

$p = new Item(); 
$p->getPointX(); 

cette fois getPointX() et est juste redondant "transmission" méthode. Je comprends que ig Point a 1000 autres méthodes, il serait dangereux de retourner tout cet objet comme return $this->point. Mais cette fois toutes les propriétés sont couvertes.

Répondre

2

Source

Parce que votre $p nécessite plus d'informations sur Point que nécessaire:

En particulier, un objet doit éviter d'invoquer des méthodes d'un objet membre retourné par une autre méthode

+0

des thats à droite, mais je ne peux pas voir le bénéfice. –

+0

@JohnSmith Lire Avantages/Inconvénients de la même ressource. – Justinas