2016-05-16 3 views
4

新しいAPIの統合ごとに多くのパラメータが追加されているクラスがあります。例えばjavaオブジェクトにコンストラクタの変更がある場合のベストプラクティス

は、以前の私は4つのパラメータを持つクラスを持っていた:

Integer a; 
String b; 
Map<String, String> c; 
List<Integer> e. 

ので、コンストラクタは:

public SampleClass(Integer a, 
        String b, 
        Map<String, String> c,  
        List<Integer> e) 
{ 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.e = e; 
} 

いくつかのチームは自分のコードでこのコンストラクタを使用して、私のAPIと統合しています。 しばらくしてから、このクラスに新しいパラメータが追加されました。すなわち

Double d; 

だから私は、新しいコンストラクタを追加しました:

public SampleClass(Integer a, 
        String b, 
        Map<String, String> c, 
        List<Integer> e, 
        Double d) 
{ 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.e = e; 
    this.d = d; 
} 

を非推奨として、私は、以前のコンストラクタをマーク。以前のコンストラクタを削除しなかったのは、削除した場合、クライアントのコードが破損するためです。

新しいパラメータが追加されるにつれ、5つのパラメータを持つコンストラクタが追加されました。

このようなシナリオが発生しないように、コンストラクタを非推奨/削除する方法に関するベストプラクティスはありますか?

+0

これが良い考えであるかどうかはわかりませんが、[Lombok](https://projectlombok.org/features/Builder.html)ビルダーパターンを使用してみてください。唯一の問題(私はこれがあなたの答えだろうと思います)は、Lombokはインスタンスがこのように作成されていることを信頼しています: 'Type.builder.param1(valueParam1).others(valueOthers)。(...).. 。(...)。ビルド 'これはあなたが以前のクライアントのために利用できないものです。それでも彼らと交渉すれば、彼らはそれをすることができないでしょうか?私はロンボクがあなたにパラメタの順序に無関係で、番号とは独立した自己管理のコンストラクタを与えることを意味します。 –

+1

'builder Pattern'を使用し、現在のクラスではコンストラクタに' overloading'を使用します – Hosseini

+0

[メソッドに多くの引数を渡すためのベストプラクティス?](http://stackoverflow.com/questions/2432443/best-practice-for-多くの引数を渡す) – Joe

答えて

-2

なぜ可変引数のコンストラクタを使用しないでください。この方法で、コンストラクタに多くの引数を渡すことができます。例えば

公共平均の2倍(ダブル...数字){

 double total = 0.0; // initialize total 

     // calculate total using the enhanced for statement 
     for (double d : numbers)    
     total += d;       

     return total/numbers.length; 
    } // end method average 
+1

理由をお願いします???????? – ramasCoder

+0

質問と回答が一致しません。 –

+0

詳しい説明をしてください。私の見解ではそれは一致します。 – ramasCoder

3

から変更古いコンストラクタ:

public SampleClass(Integer a, 
        String b, 
        Map<String, String> c,  
        List<Integer> e) 
{ 
    //Zero is passed as a default value, but you can pass anything you want 
    this(a,b,c,e,0); 
} 

これに

public SampleClass(Integer a, 
        String b, 
        Map<String, String> c,  
        List<Integer> e) 
{ 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.e = e; 
} 

それはcaフードの下に新しいものがあります。

まだ、あなたは、古いものをどの程度サポートしているかに関する十分な情報を提供していません。まったく必要ない場合はコードから削除する必要があります。この方法は、あなたは新しいコンストラクタを変更し、ワイヤー何を分析するためにAPIのユーザーを強制します。これを行わない場合

は、彼らは古いものを、使用し続けるプログラマは怠惰

:-)をしているので、
+1

それは怠惰とは関係がありません。 APIを公開すると、あなたは約束をします。その約束を実現するのはあなたの責任です。 – biziclop

+0

ええ、APIを変更して変更する必要がある場合、プログラマは新しいバージョンに更新するときに変更された内容を担当し、分析する必要があります。実際には、コードがコンパイルされ、テストが合格すると、ほとんどの人は何も変わっていないと仮定します。 @Deprecatedはそれに対抗することはほとんど行いません:-D変更が何らかの理由で重要である場合、APIからメソッドを削除することは、ユーザーが変更されたものと理由を分析することを示す良い方法です。彼らはAPIをそのまま信頼するので、新機能、変更などの価格で、常に更新を控えることができます。 – Kelevandos

+1

重要なバージョン変更時に必須のAPI変更が必要ですそれが大会です。私が別のコメントで述べたように、重要なことは、このようなインスタンスをどのように処理するかについての非常に明確な方針があることです。 – biziclop

0

Open/closed principleに従うと有益です。最初に書いたクラスは、新しい機能が必要なときに変更すべきではなく、その機能を拡張するために別のクラスを派生させるべきです。

+0

ですが、新しいパラメータが徐々に追加されるにつれて、新しいクラスが作成されることはありません。これらのクラスをすべて管理するのは難しいでしょうか? –

関連する問題