Согласно Закону Demeter, можно ли назвать методы на возвращенных объектах?
Например.
get('http://www.google.com');
return $response->getBody(); // violation?
}
}
?>
$http-> добираются (), возвращает объект. Это рассчитывает, поскольку объект создал/инстанцировал в M? Если бы Вы не можете назвать методы на нем (согласно ЛОДУ), как Вы обработали бы эту ситуацию?
Это не нарушение Закона Деметры, дан :
Более формально Закон Деметры для функции требует, чтобы метод M объект O может вызывать только методы следующих видов объекты:
- сам O
- параметры M
- любые объекты, созданные / экземпляры внутри M
- объекты O прямых компонентов
- глобальная переменная, доступная для O, в области M
Поскольку $ response - это объект, который создается в M, вы можете вызвать метод для этого объекта без нарушения. Однако было бы нарушением доступ к свойствам за пределами getBody ()
:
$length = $response->getBody()->length;
Иногда можно сказать, что закон можно упростить, сказав, что это правило «одной точки», что означает, что вы можете получить доступ к одному свойство или метод глубоко.
С одной стороны, $ response
, похоже, был создан в рамках метода m
, поэтому ответ будет положительным.
С другой стороны, поскольку $ http
был передан в m
, объект, возвращенный $ http-> get ()
, теперь представленный $ response
может быть членом $ http
, который мог быть создан до входа в m
.
Принимая во внимание интерпретацию Закона "только одна точка" (или, в данном случае стрелка), переписываем тело функции как return $ http-> get ('http://www.google.com ') -> getBody ();
предполагает, что это может быть нарушение. Сохранение промежуточных членов как локальных переменных кажется хитрым способом избежать принципа одной точки.
Я не могу дать однозначного ответа. В некоторой степени, я думаю, это зависит от того, насколько вы доверяете $ http-> get ()
, чтобы предоставить вам только что созданный объект, а не ранее существовавший член.
Одна из возможностей решить это - создать объект внутри 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.
}
}