2

これを行うための標準的な方法があるはずですが、Stackoverflowを検索する試みは失敗しました。

私は次のような方法があります:

public void processSomeWidgetsForUser(int userItemId) {
    Iterator<Widgets> iter = allWidgets.values().iterator();
    while(iter.hasNext()) {
        Widget thisWidget = iter.next();
        if (userItemId == -1 || thisWidget.getUsersItemId() == userItemId) {                 
             widget.process();
        }
    }
}

ご覧のとおり、-1はすべてを処理することを意味する「特別な値」です。これを行うことで、processSomeWidgetsForAllUsersと呼ばれる別のメソッドでループコードを繰り返す必要がなくなります。

しかし、私はこのような特別な値が誤用されたり誤解されたりしやすいので嫌いです。これはまさに私が今修正しなければならない状況です(誰かが-1が何か他のものを意味すると思った場合)。

これを改善する方法は2つしか考えられません。

  1. Widget.ALLWIDGETSのようなものと呼ばれる-1を含む定数があります。これは少なくとも自己文書化されていますが、コードによる-1の使用を停止しません(たとえば、誰かが古いコードを統合した場合)
  2. 処理するすべてのユーザーIDのリストを取得するようにメソッドを変更します。これは空の場合もありますが、パフォーマンス的にはそれほど優れていないようです(最初にすべてのユーザーIDを取得してから、削除をループする必要があります。また、番号がIDの取得と削除の間で、リスト内のウィジェットの数が変化します

もっと良い方法はありますか?明らかな何かが欠けていると確信しています。

上記のコードは少し変更されているため、コンパイルできない場合がありますが、要点を理解する必要があります。

4

4 に答える 4

4

多少冗長ではありますが、1 つではなく 3 つのメソッドを使用することで、かなりきちんとした自己文書化アプローチを作成できます。

元のメソッドprivateを作成し、あなたを追加して元のメソッドで使用する小さな変更を1つ加えてstatic final int EXECUTE_ALL = -1から、2つの新しいメソッドを追加します。

public void processWidget(int wID) throws IllegalArgumentException {
    if(wID == EXECUTE_ALL) throw new IllegalArgumentException();
    originalMethod(wID);
}

public void processAllWidgets() {
    originalMethod(EXECUTE_ALL);
}

これにより、クラスが少し雑然としますが、公開されたメソッドに関する限り、より明確になり、できれば誰にでもできるようになります。状況に応じて、例外をスローせずに無効な ID を無視するように変更できます。

もちろん、このアプローチには、クラスが他のクラスにどのように表示されるかが変わり、現在プライベートになっている originalMethod() を現在使用しているすべてのものを破壊するという大きな欠点があります。

于 2012-12-07T18:10:18.900 に答える
1

ナンバー1は非常にうまく機能します。ただし、将来のコーダー (おそらく自分自身) がその意味を理解できるように、変数が何であるかを必ず文書化してください。

/**This is the explanation for the below variable*/
public final static int ALL_WIDGETS = -1;
于 2012-12-07T18:01:38.393 に答える
1

次のような外部メソッドがあります。

static boolean idRepresentsAll(int id) {
    return id == -1;
}

この場合、別のメカニズムに置き換えることにした場合は、コード内のマジック ナンバー 1 の場所だけを置き換えます。

少なくとも、次のようなことをしたいと思うでしょう:

public static final int ID_REPRESENTING_ALL = -1;
于 2012-12-07T18:01:49.863 に答える
1

メソッドのシグネチャを変更して、それらすべてを処理したい場合にブール値を受け入れることができます。

public void processSomeWidgets(boolean doAll, int userItemId) {
    Iterator<Widgets> iter = allWidgets.values().iterator();
    while(iter.hasNext()) {
        Widget thisWidget = iter.next();
        if (doAll || thisWidget.getUsersItemId() == userItemId) {                 
             widget.process();
        }
    }
}

これにより、特別な値がないため、より明確になり、私の意見では読みやすくなります。

于 2012-12-07T18:14:46.267 に答える