8

テーブル レイアウトで行を作成するクラスがあります。行の作成は、データとメタデータに依存します。メタデータは可視性プロパティの表示/非表示などのように各行で同じであるため、メタデータ プロパティを静的として作成しinitWidget、 ofを使用して一度初期化しましたRowWidget

ちょうど例:

class RowWidget extends FlexTable{

  public static void initWidget(Form form,
    HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
    GridMode gridMode,
    boolean isApplied,
    boolean isChildExist,
    boolean isChildAttachment)
    { 
      // ...
    }
}

次に、各レコード データに対して以下のコンストラクターを呼び出しました。

public RowWidget(DataRawType dataRawType, Data data, Data parentData) {
 // ...
}

私が思ったように、これは正しいアプローチではありません。誰かがこのクラスを見たときのパターンとして、それが1つの行を作成することを理解するためです。私は最初に電話したくありませんinitWidget。必要な各パラメーターをコンストラクターでのみ渡したい

public RowWidget(DataRawType dataRawType,
  Data data,
  Data parentData,
  Form form,
  HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
  GridMode gridMode,
  boolean isApplied,
  boolean isChildExist,
  boolean isChildAttachment) {
  // ...
}

しかし、これにより、コンストラクターには引数がありません。コンストラクターに5つ以上のパラメーターがあるのも悪いパターンだと思います。

誰かが私に提案していますか:

  • 別のインスタンスで必要な同じプロパティを持つクラスを構築する方法は?

:これは静的のみで可能であることは知っていますが、静的を使用したくありません。

  • すべてのインスタンスに対してデフォルトの修正プロパティを持つクラスを構築する最良の方法は何ですか?

:それを達成するために別のクラスを作成したくありません。または任意のゲッター/セッター メソッド。

前もって感謝します。

4

6 に答える 6

0

静的な initWidget() のことは、私には適切ではないようです。おそらく、いくつかのプロパティを共有する のセットは 1 つしかありませんが、RowWidgetのセットを 2 つ持つことも合理的でありRowWidget、各セットには独自の「共有」プロパティがあります。コードをリファクタリングしてより合理的な設計を作成すれば、物事ははるかに流暢になり、より合理的な API を構築するためのより多くの選択肢が得られます。

ここで、RowGroup のようなものを導入するとします (これは、あなたが言及した「共有」のものを表します)。

(正直なところ、私はあなたのデザインの意味をよく理解していません。私はあなたのコードに基づいてそれを作っているだけです);

public class RowGroup {
    public RowGroup(Form form,
                    HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
                    GridMode gridMode,
                    boolean isApplied,
                    boolean isChildExist,
                    boolean isChildAttachment) { .... }

    public void addRow(DataRawType dataRawType, Data data, Data parentData) {...}
}

人々が使用するとき、それは次のようになります。

RowGroup rowGroup = new RowGroup(form, permissionMap, gridMode, isApplied, isChildExist, isChildAttach);
rowGroup.addRow(DataRawType.A, dataA, parentA);
rowGroup.addRow(DataRawType.B, dataB, parentB);

ビルダーのような構文やその他の多くの選択肢を提供することさえできます。

RowGroup rowGroup 
        = new RowGroup(.....)
              .addRow(DataRawType.A, dataA, parentA)
              .addRow(DataRawType.B, dataB, parentB);

さらに重要なことは、デザインがより理にかなっているということです。

于 2013-05-28T07:14:27.633 に答える
0

RowWidget-class の例から -classからパラメーターを分離/抽出できますRowWidgetConfig

class RowWidgetConfig {
    // put here all your parameters that you need to initialize only once
    // init using setters
}

そのクラスのインスタンスを 1 回作成し、それを他のパラメーターと一緒にRowWidgetコンストラクターに渡します。

別の代替手段は、インスタンスfactoryを作成することです。RowWidgetファクトリには、行インスタンスに必要なすべてのパラメータも含まれます。また、ファクトリ メソッドcreateNewRowWidgetウィッチは、ファクトリに含まれるパラメータに基づいてインスタンスを作成します。

class RowWidgetFactory {
    // put here all your parameters that you need to initialize only once
    // init using setters

    public RowWidget createNewRowWidget() {
        // create
        return ...
    }
}
于 2013-05-28T07:08:52.823 に答える
0

変更するプロパティの newValues を受け入れるメソッドを作成し、このメソッドを呼び出したインスタンスからコピーされた他のすべてのプロパティを含むクラスの新しいインスタンスを返す方法を作成しないでください。

于 2013-05-28T07:05:08.560 に答える