0

この種の重複コードを削除する方法があるかどうか疑問に思っていました (プログラム全体で発生します)。

public void pickUp(Cointainer in)
{
    if(playerContainer.returnSomething() == null)
    {
        playerContainer.setSomething(in.returnSomething());
        in.setSomething(null);
    }
}

public void dropContainer (Container out)
{
    if(out.returnSomething() == null)
    {
        out.setSomething(playerContainer.returnSomething());
        playerContainer.setSomething(null);
    }
}

上記の例からわかるように、2 つのメソッドは本質的にまったく同じですが、どのコンテナーが null であるとテストされるか、およびオブジェクトが最終的にどのコンテナーに格納されるかが異なります。別の例は、コードの後半で発生します。ここでは、複数のオブジェクトが異なる順序でテストされます。

if (control = 1)
{
  if(con1 == null)
    return con1
  else if (con2 == null)
    return con2
  else
    return con3
}
else
{
  if(con3 != null)
    return con3
  if(con2 != null)
    return con2
  else
    return con1
}

このタイプのステートメントを 1 つの if に減らす方法はありますか?

私の質問が本当に初心者/遅れている場合は申し訳ありませんが、特にここで尋ねた最後の質問を考えると、その側面が少し欠けている可能性があります:/

とにかく、これを読んでくれてありがとう:)

4

4 に答える 4

0

可能であれば、この方法で使用したいすべてのクラスが同じインターフェースを実装するようにします。たとえば、returnSomething メソッドと setSomething メソッドを含む新しい Doable インターフェイスを実装する PlayerContainer クラスを作成します。次に、メソッドは Doable 型の引数を 2 つ (オブジェクトごとに 1 つ) 取り、作業幅を確保します。結果は次のようになります。

public interface Doable {
    Object returnSomething();
    setSomething(Object);
}

class MyClass {
    public void pickUp(Doable one, Doable two) {
        if(two.returnSomething() == null) {
            two.setSomething(one.returnSomething());
            one.setSomething(null);
        }
    }
}

編集: returnSomething の戻り値の型と setSomething のパラメーターは、実際に使用するものに調整する必要があることに注意してください。

もちろん、これはコードのほとんどの部分に適用できます。

インターフェースを実装する必要があるクラスのコードがない場合は、それらを拡張して、インターフェースを実装するサブクラスを作成できます。

于 2013-04-28T08:51:40.337 に答える
0

2 番目の部分については、Dev Blanked が既に提案しているように、このようなことを行うことができます。ただし、これにより、空間と時間がさらに複雑になります。

private Object getMatch(Object obj1, Object obj2, Object obj3, boolean reverse) {
    List<Object> availableObjects = new ArrayList<Object>();
    availableObjects.add(obj1);
    availableObjects.add(obj2);
    availableObjects.add(obj3);
    int size = availableObjects.size();
    for (int i = 0 ; i < size ; i++) {
        Object nxtObject = reverse ? availableObjects.get(size - i -1) :  availableObjects.get(i);
        if (nxtObject != null) {
            return nxtObject;
        }
    }
    return null;
}
于 2013-04-28T09:52:59.813 に答える
0

まず最初に、各関数が何をするかを明確に定義する必要があります。コードが重複している根本的な理由は、開発者がその機能を必要としていて、正確な機能が既に実装されていることを知らずに実装した可能性があります。これを防ぐために、開発者はその機能を探す場所を知っておく必要があります。

単一責任の原則を読むことを強くお勧めします。オブジェクト指向の原則を使用しないと、問題が再び発生する可能性が高くなります。

2 番目のケースでは、可能であれば条件をマージすることをお勧めします。しかし、これはあなたの条件が何であるかに大きく依存します.

于 2013-04-28T08:55:08.227 に答える