法のデメーテル、および戻り値
-
25-09-2019 - |
質問
に応じて 法のデメーテル, で呼び出す方法に返されるオブジェクト?
E.g.
<?php
class O
{
public function m($http)
{
$response = $http->get('http://www.google.com');
return $response->getBody(); // violation?
}
}
?>
$http->get()が返すオブジェクトです。このカウントオブジェクトとして作成/インスタンスを生成内M?できない場合は通話方法となっている(LoD)、あなたは何点ぐらいになると思取り扱っています。
解決
これは、違法のデメーテル, され:
より厳密に言えば、法のデメーテルのための 機能を必要とする方法Mの オブジェクトOの場合にのみ呼び出しの 方法は以下の種類の オブジェクト
- Oそのもの
- M'sパラメータ
- オブジェクトの作成/インスタンスを生成M以内
- O直接コンポーネントオブジェクト
- グローバル変数にアクセス可能Oの範囲M
か$対応するオブジェクトが作成したMできるメソッドを呼び出しにそのオブジェクトなの侵害となります。しかし、この違反へのアクセスプロパティを超えて getBody()
:
$length = $response->getBody()->length;
ものであると言えるだろう、法律で単純にすることが求められているよ"ということで、"ワンドット"は、原則ときにアクセスプロパティやメソッド深い。
他のヒント
一方で、$response
は、答えはイエスであるように思われるので、この方法のm
内に作成されているように見えます。
一方、$http
はm
に渡されているので、今$http->get()
表される$response
によって返されるオブジェクトは、従来$http
のエントリに作成されたかもしれないm
のメンバーであるかもしれない。
return $http->get('http://www.google.com')->getBody();
が、それは違反であるかもしれないことを示唆しているとして、あなたの関数の本体を書き換える「だけで1ドット」(または、この場合の矢印で)法律の解釈を、考えます。ローカル変数として中間部材を保存すると、一点主義を避けるために、危険な方法のように思える。
私は決定的な答えを与えることはできません。ある程度までは、私はそれはあなたがあなたの新しく作成されたオブジェクトではなく、既存のメンバーを与えること$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.
}
}