Закон Demeter и возвращаемых значений

Согласно Закону Demeter, можно ли назвать методы на возвращенных объектах?

Например.

get('http://www.google.com');
        return $response->getBody(); // violation?
    }
}
?>

$http-> добираются (), возвращает объект. Это рассчитывает, поскольку объект создал/инстанцировал в M? Если бы Вы не можете назвать методы на нем (согласно ЛОДУ), как Вы обработали бы эту ситуацию?

5
задан Sjoerd 9 June 2010 в 14:11
поделиться

3 ответа

Это не нарушение Закона Деметры, дан :

Более формально Закон Деметры для функции требует, чтобы метод M объект O может вызывать только методы следующих видов объекты:

  • сам O
  • параметры M
  • любые объекты, созданные / экземпляры внутри M
  • объекты O прямых компонентов
  • глобальная переменная, доступная для O, в области M

Поскольку $ response - это объект, который создается в M, вы можете вызвать метод для этого объекта без нарушения. Однако было бы нарушением доступ к свойствам за пределами getBody () :

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

Иногда можно сказать, что закон можно упростить, сказав, что это правило «одной точки», что означает, что вы можете получить доступ к одному свойство или метод глубоко.

6
ответ дан 18 December 2019 в 14:42
поделиться

С одной стороны, $ response , похоже, был создан в рамках метода m , поэтому ответ будет положительным.

С другой стороны, поскольку $ http был передан в m , объект, возвращенный $ http-> get () , теперь представленный $ response может быть членом $ http , который мог быть создан до входа в m .

Принимая во внимание интерпретацию Закона "только одна точка" (или, в данном случае стрелка), переписываем тело функции как return $ http-> get ('http://www.google.com ') -> getBody (); предполагает, что это может быть нарушение. Сохранение промежуточных членов как локальных переменных кажется хитрым способом избежать принципа одной точки.

Я не могу дать однозначного ответа. В некоторой степени, я думаю, это зависит от того, насколько вы доверяете $ http-> get () , чтобы предоставить вам только что созданный объект, а не ранее существовавший член.

6
ответ дан 18 December 2019 в 14:42
поделиться

Одна из возможностей решить это - создать объект внутри m(), и позволить http->get() заполнить его информацией.

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.
    }
}
1
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: