私が書いたいくつかのコードを見てみると、次の構成要素に出会い、考えさせられました。一見、十分きれいに見えます。はい、実際のコードでは、getLocation()
メソッドには、取得する場所を正確に説明する、より具体的な名前があります。
service.setLocation(this.configuration.getLocation().toString());
この場合、service
は、メソッド内で宣言された既知の型のインスタンス変数です。this.configuration
クラスコンストラクターに渡されたものであり、特定のインターフェイス(パブリックgetLocation()
メソッドを必須とする)を実装するクラスのインスタンスです。したがって、式の戻り値の型this.configuration.getLocation()
は既知です。特にこの場合には、それがあるjava.net.URL
のに対し、service.setLocation()
望んでいますString
。2種類の文字列とURLが直接の互換性はありませんので、いくつかの変換の並べ替えは、丸い穴に四角いペグに合わせて必要とされます。
しかし、中に引用されたようにデメテルの法則によればクリーンコード、メソッドFクラスでCが唯一のメソッドを呼び出す必要がCによって作成または引数として渡されるオブジェクトF、およびインスタンス変数に保持されているオブジェクトC。それを超えるもの(toString()
メソッド呼び出し自体の結果として作成された一時オブジェクトを考慮する場合を除き、上記の特定のケースでは最後です。この場合、法律全体が議論の余地がないようです)。
上記の制約が与えられた場合、上記のような呼び出しが推奨されない、または拒否されるべきである正当な理由はありますか?それとも、私は過度に細心の注意を払っていますか?
パラメーターとして渡されたオブジェクト(などによって返されるオブジェクト)URLToString()
を単に呼び出し、結果を返すメソッドを実装する場合、まったく同じ結果を得るために呼び出しをラップすることができます。効果的には、変換を1ステップ外に移動するだけです。それはどういうわけかそれを受け入れられるでしょうか?(思わないそのすべてが少し動き回る事があるので、それは、任意の違いのいずれかの方法を作るべきではないことを、直感的に、私には。しかし、デメテルの法則の手紙で行く引用として、それはI以来、許容可能ですその後、関数のパラメーターを直接操作します。)toString()
URL
getLocation()
getLocation()
これがtoString()
標準型を呼び出すよりも少しエキゾチックなものである場合、違いが生じるでしょうか?
答えるときservice
は、変数が属する型の動作またはAPIを変更することは実用的ではないことに注意してください。また、議論のために、戻り値の型を変更することgetLocation()
も非現実的であるとしましょう。