0

私のクラスには 4 つのインスタンスがあり、テーブル インスタンスRichTableの概念があります。currentフラグresetAllに応じて、すべてのテーブルまたは現在のテーブル以外のすべてのテーブルの選択をクリアする必要があります。true の場合resetAllはすべてをクリアし、そうでない場合は現在のものを除外します。現在のテーブルのインデックスは、クリーンアップ アクションを実行するメソッドにパラメーターとして渡されます。

すべてをクリアするための呼び出しは次のようになります。

clearSubTypeSettings(true,-1);

現在のものを除くすべてをクリアするための呼び出しは、次のようになります。

clearSubTypeSettings(true, col);

上記のメソッドの実装は次のとおりです。

private void clearSubTypeSettings(boolean resetAll, int exceptControl) {
    if (!resetAll) {
        clearAllExceptCurrent(exceptControl);
    } else {
        clearAll();
    }
 }

現在、これら 2 つのメソッドclearAllExceptCurrent(exceptControl)clearAll()はほとんど同じように見えます。実装は次のとおりです。

  private void clearAll() {
        for (int i = 0; i < SUBTYPE_TABLES; i++)
            if (getSubTypeTable(i).getSelectedRowKeys() != null) {
                RichTable richTable = getSubTypeTable(i);
                RowKeySet rowkeySet = richTable.getSelectedRowKeys();
                rowkeySet.clear();
                AdfFacesContext.getCurrentInstance().addPartialTarget(richTable);
            }
    }

private void clearAllExceptCurrent(int exceptControl) {
    for (int i = 0; i < SUBTYPE_TABLES; i++)
        if (i != exceptControl && getSubTypeTable(i).getSelectedRowKeys() != null) {
            RichTable richTable = getSubTypeTable(i);
            RowKeySet rowkeySet = richTable.getSelectedRowKeys();
            rowkeySet.clear();
            AdfFacesContext.getCurrentInstance().addPartialTarget(richTable);
        }
}

ここに冗長なコードを重複して書いているように感じ、将来のメンテナンスが複雑になります。このコードを改善して、よりオブジェクト指向にするにはどうすればよいですか?

4

2 に答える 2

3

clearAll() 委任(=> OOPパターン)をclearAllExceptCurrent()(=>重複したコードを削除してコードを改善し、保守しやすくする)に任せることができます。

private void clearAll() {
   clearAllExceptCurrent(-1);
}

2つの方法の唯一の違いは、の条件i != exceptControlですclearAllExceptCurrent()。この条件を通過することにより-1、常にtrue、したがって事実上存在しなくなります。

于 2013-01-24T13:47:46.690 に答える
0

繰り返されるコードの大部分は、テーブルをクリアするビットです。では、どうでしょうか。

private void clearTable(int id) {
    if (getSubTypeTable(i).getSelectedRowKeys() != null) {
        RichTable richTable = getSubTypeTable(i);
        RowKeySet rowkeySet = richTable.getSelectedRowKeys();
        rowkeySet.clear();
        AdfFacesContext.getCurrentInstance().addPartialTarget(richTable);
    }
}

それで:

 private void clearAll() {
    for (int i = 0; i < SUBTYPE_TABLES; i++) {
        clearTable(i);
    }
 }

private void clearAllExceptCurrent(int exceptControl) {
    for (int i = 0; i < SUBTYPE_TABLES; i++) {
        if (i != exceptControl) {
            clearTable(i)
        }
    }
}

編集:ifステートメントを内部に移動clearTable

于 2013-01-24T13:47:14.460 に答える