0

ImmutablePart不変の純粋なデータであるこのクラスについて考えてみましょうObject:

public class Clazz1  {
    private final ImmutablePart immu ;

    private String f1;

    private boolean f2;

    private int f3;

    /** some constructor building up the immu and 
    setting the fields to init values
    ...
    ...
    **/

    public ImmutablePart getImmu(){return immu;}

    public String getF1(){return f1;}

    public boolean getF2(){return f2;}

    public int getF3(){return f3;} 

    public void setF1(String f1){this.f1=f1;}

    public void setF2(boolean f2){this.f2=f2;}

    public void setF3(int f3){this.f3=f3;}         
}

この段階で構成を使用して、一方の部分が変更可能で、もう一方の部分が不変であることをより明確にするのは良い習慣ですか、それとも単なるボイラープレートですか? このように (MutablePartのフィールドに getter と setter を使用Clazz1)。

public class Clazz2  {
    private final ImmutablePart immu ;

    private final MutablePart mutable;

    /** some constructor building up the two final objects
    ...
    ...
    **/

    public ImmutablePart getImmu(){return immu;}

    public MutablePart getMutable(){return mutable;}

}

EDIT1 :より具体的に言っても大丈夫です。不変部分は、ある種のメタ情報を含むファイルから構築されているため、変更することは意図されていません。変更可能な部分は、ランタイムに関して進化します。私が p2p アプリケーションに取り組んでいるとしましょう。不変部分には、クライアントがピアと共有する一連のファイルに関するすべての情報と、受信したパケットの信頼性を保証するためのハッシュキーが含まれます。可変部分には、共有の状態に関する情報が含まれます。つまり、いくつかの状態、アップロードされたバイト数、ダウンロードされたバイト数などです。不変部分は簡単に「metaInfo」と呼ばれ、可変部分は「コンテキスト」と呼ばれます。より意味のある名前が必要な場合。しかし、私の質問は、そのような設計の有用性に関するものでした。回答ありがとうございます。

EDIT2:私が選んだ名前は、抽象化の目的でここにあるだけです。実際の実装では、より良い名前を付けます。つまり、一見すると混乱するかもしれませんが、「明示的」と言うのは、一方の部分を「不変」、もう一方の部分を「変更可能」と明示的に命名するのではなく、2 つの異なるオブジェクトへの両方の部分を厳密に区別することを意味することに同意します。 .

4

3 に答える 3

1

オブジェクトが他のオブジェクトで構成されていることは一般的であり、それらのコンポーネントの一部が不変 (インスタンス間で共通のデータを共有するためなど) である一方で、他のコンポーネントが可変であることは珍しくありません。

ただし、可変コンポーネントと不変コンポーネントを明示的に呼び出す命名スキームを採用することはしません。目的を伝えるわかりやすい名前に固執します。外部から見ると、通常、可変性はオブジェクト全体と見なされます。オブジェクトの一部が可変である場合、オブジェクトは可変と見なされるか、完全に不変です。さらに、オブジェクトのコンシューマーは、通常、データの取得元や内部構造よりも、オブジェクトによって公開されているデータに関心があるため、メンバーを整理して名前を付けるときは、このことを念頭に置いてください。


メタデータを分離する提案されたデザインに関しては、それは完全に理にかなっています。単純な古い Java オブジェクトと似ているわけではありません。すべてのオブジェクトのメタデータ (そのクラス定義) はインスタンス データから分離され、単一の場所で公開されます: getClass(). ただし、名前は (メタ) データを表すものであり、(im) 可変性を表すものではないことに注意してください。

于 2014-10-21T20:30:36.817 に答える