2010-12-14 10 views
8

にアクセス対方法にフィールドを渡す:Javaのスタイル/ベストプラクティス - 以下のクラスを考えると、Javaでは直接

public class MyClass { 
    private final Dependency dependency; 
    public MyClass(Dependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void doWork() 
    { 
     // validate dependency... 
    } 

doWorkメソッドはdependencyを使用してメソッドを呼び出す必要があります。

「ベストプラクティス」と見なされる次の2つのバリエーションのどれですか?その理由は何ですか?

// Access dependency directly 
    void validateDependency() 
    { 
     this.dependency.something(); 
    } 

    // access dependency as passed to the method 
    void validateDependency(Dependency dependency) 
    { 
     dependency.something(); 
    } 

自分はそれが(わずか、いえ)単独でテストする方法を容易にするように、方法に直接依存性を渡し、後者に有利見つけます。

しかし、ここではJavaのコンベンション/ベストプラクティスに興味があります。

+4

それは確かに状況によって異なります。 –

+1

正確に!状況に依存します。たとえば、時間的に結合された操作(特定の順序で呼び出す必要がある)がある場合は、後者を使用する必要があります。さもなければ、あなたのコードのクライアント/保守担当者は、NPEの、あるいはより混乱した動作を得ることになります。 – lucas1000001

+0

また、極端にそれを取るために - 私はあなたが本当に対オブジェクト指向プログラミングスタイルを検討していると思います - ooは前者、後者は後者です。 – lucas1000001

答えて

9

クラスには、その状態に結合されている状態と操作があるため、クラスが存在します。その状態の一部をクラスメソッドにパラメータとして渡す正当な理由はありません。

実際、その状態は実際にそのクラスに属するべきではないことを私に示します。または、メソッドがクラスに属していないこと。

パラメータを「単体テストが容易になるようにする」は、後者が保持する(クラス内にあるべきではない)良い指標です。

+0

+1私の良い前に+1 –

-1

正しい方法はありません。私はそこに変数を置く方が好きです。

+1

-1 APIはもっとよく考えなければなりません。 –

-1

依存性注入。第2の選択肢は「最良」です。

"依存関係"クラスをインターフェイスにすると、コードはモジュール化され、テストが容易になり、結合が少なくなります。

+1

-1彼の "Dependency"はメンバ変数です。それはすでに結合されています。この「Dependency Injection」を呼び出すと、状況がわかりにくくなります。 –

3

あなたの例では、メンバー関数ではなく静的関数に適した依存関係を使用するように関数に要求しています。

親指の私のルールは次のとおりです。使用メンバーに直接メンバーを所有しているオブジェクトのメソッドを呼び出すときには、直接の依存性に関連する何かをテストする/実行する際の参照を渡し、後者

ための静的メソッドを好みます少し冗長ですが、私はそれが助けてくれることを願っています。常に正しいことをしようとすると、この小さな違いはコードのメンテナンスや可読性に大きな影響を与えません。

関連する問題