2015-09-24 7 views
7

これはベストプラクティスのプログラミングに関する質問ですが、タイトルの質問をどのように表現するのか分かりませんでした。申し訳ありませんが、ここで行っています。nullパラメータでオーバーロードされたメソッドを呼び出すことをお勧めしますか?

私はマネージャーのメソッド、またはコントローラ、こうして持っていた:

public boolean myMethod(Param1 param1); 

をそして、それが必要とする他の方法を呼び出すためのアプリケーションの変更ので、私は、このようにそれを再定義する必要がありましたPARAM2とparam3:

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 

今、私は「常に」3つのparamsを持つ方法は(今のところ、多分将来的にはそこに変更があると私はnull以外のparamsでそれを呼び出す必要があり)と呼ばれることを実現param2=nullparam3=nullであるため、1番目の実装では私がやった方法:

public boolean myMethod(Param1 param1) { 
    return this.myMethod(param1, null, null); 
} 

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) { 
    /* Call to other methods that is needed to pass it param2 and param3 */ 
} 

だから、マネージャのメソッドの呼び出し、およびオリジナルの方法は、,:

boolean isTrue = myManager.myMethod(param1); 

である。これは、一つの選択肢である、他の選択肢がnullのparamsを渡すことです呼び出しから:

boolean isTrue = myManager.myMethod(param1, null, null); 

そして、私のマネージャーに一つだけの方法を聞かせて:

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 

したがって、実際の質問は次のとおりです。これを実行してベストプラクティスについて話す最善の方法は何ですか?それはマネージャの実装でメソッドをオーバーロードし、nullパラメータで呼び出す場合は間違っていますか?

ありがとうございます!

ご挨拶。

+1

二つの迅速なアイデアのインタフェースのデフォルトの方法についての詳細を読むことができます:1.可変引数。特に、すべてのパラメータが同じタイプの場合。 2.デコレータパターン。実行時にメソッドを "充実させる"ことができます。あなたはインターネット上で多くの例を見つけることができます。幸運;) – Tinki

答えて

4

より多くのパラメータで他のメソッドを呼び出すより少ないパラメータでオーバーロードされたメソッドは、Javaでは一般的なプラクティスであり、 "デフォルト"パラメータを実装するJavaの方法です。

デフォルト値はnullである必要はなく、任意の値にすることができます。

通常、複数のパラメータを持つメソッドを呼び出すと、渡された値によってパラメータの性質がわかります。 nullfalsetrue、または0のようなパラメータ定数は、パラメータの意味にヒントを与えないため、コードの読み込みが難しくなります。

通常、パラメータの数が少ないコールがより明白です。したがって、「デフォルト」パラメータでオーバーロードする方が、定数パラメータが多い1つのメソッドよりも優先されます。

1

この質問は、コードの一部がnullであると予想されるかどうかによって異なります。 this質問の人気を考えると、可能な限りnull値を送信することを避けることをお勧めします。

この場合、null値を渡すメソッドの所有者であるため、1つのパラメータで動作するメソッドと3つのパラメータで動作するメソッドの2つのバージョンがあることをお勧めします。

既存のメソッドを変更すると、既存のコードが破損する可能性があるため、通常は変更しないでください。一方、新しい機能を追加する場合は、に変更する必要があります。以前の動作全体と新しい動作をテストするのではなく、新しい動作をテストするので、比較的ピンポイントのテストケースを構築することもできます。

1

3つのパラメータのメソッドのみを提供し、メソッドのすべてのユーザーに値として "null"を指定する代わりに、前述の2つのメソッドを定義することを提案します。除去された1パラメータ・メソッドを提供することにより、2つの他のパラメータがオプションであることが明示される。

これもthis質問の正解で推奨されます。

1

それは本質的に良いも悪い習慣はありません。前述のように、これはJavaでデフォルトのパラメータを導入するアプローチです。

1つのパラメータしか使用せず、背後で別のオーバーロードを呼び出すオーバーロード(デフォルトでは他のパラメータを渡します)の唯一の潜在的な問題は、メソッドのドキュメントから明らかでない場合です。

public boolean myMethod(Param1 param1) { 
    return this.myMethod(param1, null, null); 
} 

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) { 
    /* Call to other methods that is needed to pass it param2 and param3 */ 
} 

あなたは、ユーザーがそれを呼び出すの意味を理解していることを確認するために、この場合には適切にあなたの最初の方法を文書化する必要があります。あなたはまだあなたの方法を文書化する必要がありますが - あなたは明示的nullに設定する必要のあるパラメータを受け取るオーバーロードがある場合は、この「隠し」問題はありません。

私はそれが本当にあなた次第だと思います。どんな選択をしても、APIを文書化してください。

ちなみに、パラメータのリストが大きくなり、膨大な数のオーバーロードが発生する場合は、オブジェクトをパラメータとして渡すか、他のパターンを使用することを検討してください。

2

私たちが話題にしている間:デフォルトのメソッド:

のJava 8は、具体的Interfaceの複数のバージョンをサポートするために設計された、新しい機能を導入しました。あなたのManagerクラスがMyInterfaceを実装しているとしましょう。だから、インタフェースの最初のバージョンは、技術の絶えず変化する世界に従っで、その後

public Interface MyInterface { 
    public boolean myMethod(Param1 param1); 
} 

、だろう、要件が変更されます。 myMethod()の新しい署名が必要です。デフォルトのメソッドの機能を使用すると、インターフェイスに後方compatilibityの責任をdelegeteできます

public interface MyInterface { 

    // v1 with default implementation 
    default boolean myMethod(Param1 param1) { 
     return myMethod(param1, null, null); 
    } 

    // new v2 - pure virtual 
    public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 
} 

あなたはOracle tutorial on the subject

+0

あなたは 'default'キーワードがなく、' interface'はすべて小文字です。 – Andreas

+0

固定、ありがとう.. –

関連する問題