0

私が持っているとしましょう:

if (count <= instance.getFCount()) {
    //do something and return String
} else if (count <= instance.getFSCount()) {
    //do something and return String
} else if (count <= instance.getTCount()) {
    //do something and return String
} else if (count <= instance.getOCount()) {
    //do something and return String
}

このコードをよりオブジェクト指向のものに置き換える方法を考えています。問題は、次のようなステートメントがある場合です。

if (count <= 0) {
    //do something and return String
} else if (count <= 1) {
    //do something and return String
} else if (count <= 2) {
    //do something and return String
} else if (count <= 3) {
    //do something and return String
}

私の値0、1、2、3は常に静的であるため、ファクトリパターンまたは列挙型ベースのアプローチに置き換えることができます。たとえば、数値に対してクラスを保持するマップを作成すると、カウントが 0 の場合、ゼロでマップされたクラスからインスタンスを作成する必要があることがわかります。

しかし、if条件に静的な値がない場合に何か方法があるかどうかを考えています。たとえば、 this: に返されるものはinstance.getOCount()構成によって異なる可能性があるためです。

これを達成する方法を教えてください。

4

4 に答える 4

11

if elseさまざまなステートメントが多数ある場合は、戦略パターンを使用できます。これにより、ベスト プラクティスに準拠した管理しやすいコードを作成できます。

于 2013-02-26T13:49:51.273 に答える
5

このような単純なロジックを設計パターンに置き換える必要はないと思います。それは正当化されません。Aは改善されます (が整数であるとswitch仮定します) が、なぜたくさんのクラスを作成するのでしょうか? countそれぞれに追加の異なる動作がある場合にのみ正当化されます。

于 2013-02-26T13:51:12.737 に答える
3

NavigableMapaなどのa を使用するTreeMapと、キーがしきい値で、値がCallables で、適切なものを取得して呼び出すことができますCallable。すべてワンライナーで実行できます。関連するメソッドはNavigableMap#ceilingEntry.

final NavigableMap<Integer, Callable<String>> strats = new TreeMap<>();

...

return strats.ceilingEntry(val).getValue().call(args);
于 2013-02-26T13:52:02.293 に答える
1

ここでパターンを使用することが解決策だとは思いません...元のコードよりもすべてが読みにくくなります。しかし、確信がある場合、これは 1 つのオプションです。インスタンスがクラス User に属しているとしましょう。インターフェイスを作成する

public interface IDynamicAction<T> {
boolean select(T t);
String action(T t);
}

リストを作る

List<IDynamicAction<User>> actions = new ArrayList<IDynamicAction<User>>();
actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getFSCount();
}

@Override
public String action(User t) {
    System.out.println("count <= instance.getFSCount()");
    return "count <= instance.getFSCount()";
}
});


actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getTCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getTCount()");
    return " count <= instance.getTCount()";
}
});

actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getOCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getOCount()");
    return " count <= instance.getOCount()";
}
});

そして、コードを実行します

for(IDynamicAction<User> action : actions){
if(action.select(instance)){
    String s = action.action(instance);
    System.out.println(s);
    break;
}

}

中断に注意してください。コードに基づいて実行できるアクションは 1 つだけだと思います。戻り値が必要ない場合は、インターフェイスの代わりに抽象クラスを使用して、if(select) action(); を作成できます。AbstractDynamicAction クラスの一部で、コードがより適切になります

Java7は、そのようなことをするのに本当に役立ちません。閉鎖は、これを目に見えやすくします...しかし、IMHO、元の複数のIFが道です。

于 2013-02-26T15:30:15.300 に答える