Почему лучше обернуть (и несколько) код ради закона Деметры?

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;
    }
}

сначала я бы написал это:

class Item
{
    private $point; // Point

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

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

а потом:

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

но они говорят, что это нарушает этот закон. После рефакторинга:

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();
    }
}

а потом:

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

этот раз getPointX() а также getPointY() это просто избыточный метод "передачи". Я понимаю что ig Point имеет 1000 других методов, было бы небезопасно просто вернуть весь этот объект как return $this->point, Но на этот раз все свойства покрыты.

1 ответ

Источник

Потому что ваш $p требует больше информации о Point чем это нужно:

В частности, объект должен избегать вызова методов объекта-члена, возвращаемого другим методом

Другие вопросы по тегам