2016-06-13 6 views
-1
私は以下のコードの設計を改善するにはどうすればよい

場合を取り除きます「もの」を設定する必要があります。クライアントは、フラグが設定されている場合、各フラグに対して何をすべきかを知っています。私はClientのif文と、単にConfigurationインスタンスのブール値フラグを設定するという概念を取り除きたいと思います。これにもっと「汎用的な」オブジェクト指向のアプローチを提案できますか?は、コード設計を改善するためのステートメント

種類は、あなたが落とし穴

は、このを見てみましょう...列挙子のように....その場合には、設計では、より柔軟なものを使用してみてくださいを書いているように見えます

+1

コード最適化は一般的にオフトピックです... –

答えて

1

あなたはStrategyパターンを使用することができます。 各Ifは独自のロジックでdoStuffを実装する戦略になります。プロパティ(A、B ...)が設定されている場合は、ストラテジをリストに追加します。あなたは、単に戦略上のループに必要と任意のIFSせずに、それらを実行します。

public class Foo { 
    public Configuration configure() { 
     return new Configuration().withPropertyA().withPropertyB(); 
    } 
} 

class Configuration { 
    Set<StuffStrategy> strategies = new HashSet<StuffStrategy>(); 

    public Configuration withPropertyA() { 
     strategies.add(new PropertyAStrategy()); 
     return this; 
    } 

    public Configuration withPropertyB() { 
     strategies.add(new PropertyBStrategy()); 
     return this; 
    } 

    public void executeStrategies() { 
     for (StuffStrategy strategy : strategies) { 
      strategy.doStuff(); 
     } 
    } 
} 

interface StuffStrategy { 
    public void doStuff(); 
} 
class PropertyAStrategy implements StuffStrategy { 
    @Override 
    public void doStuff() { 
    } 
} 

class PropertyBStrategy implements StuffStrategy { 
    @Override 
    public void doStuff() { 
    } 
} 

class Client { 
    public void someMethod(Configuration config) { 
     config.executeStrategies(); 
    } 
} 
-1

について:

例:

public class Foo { 
    public Configuration configure() { 
    return new Configuration(Config.A); 
    } 
} 

class Configuration { 

enum Config{ 
A,B, NONE} 

    private Config propertyConfig = Config.NONE; 

    public Configuration(Config a) { 
    propertyConfig=a; 
    } 


    public Config getConfig() { 
    return this.propertyConfig; 
    } 

    ... 
} 

class Client { 

    public void someMethod(Configuration config) { 
     switch (config.getConfig()) { 
    case A: 
     System.out.println("a config"); 
     break; 
    case B: 
     System.out.println("b config"); 
     break; 

    default: 
     break; 
    } 
    // ... 
} 

} 
+2

'if'文を' switch-case'に置き換えました。どのようにそれはより良い/異なっていますか? – Tunaki

+0

スイッチケースがif elseよりも速く、コード内のデザインの事実を省略していることは承知していますか? –

+0

私は実際の環境でこれを測定したいと思うかもしれませんが、多少速いでしょう。つまり、問題はコードの設計についてです。 – Tunaki

1

私は確かに、あなたはより多くのパラメータを持つことができる場合は、currenly特に何よりも多くのオブジェクト指向のアプローチを見つけることができるとは考えていませんこれはどういうわけかよく知られているデザインパターンBuilderです。あなたのオブジェクトをConfigurationから外して不変にすることによって、このパターンを正しく実装することができれば、ビルダークラスだけがConfigurationのインスタンスを作成できるはずです。あなたのビルダーは、変更不可能なConfigurationインスタンスを返すbuild()メソッドを持つ可変静的内部クラスでなければなりません。

+0

@Alexはこれに対してクリーンなオブジェクト指向のアプローチを提供していたと思います。しかし、私はあなたにビルダーのヒントのための投票を与えます。 thx – Moonlit

+0

@ user1291235あなたが言ったように「きれい」であっても、それは全く柔軟ではありませんが、あなたのニーズが少し変わり、AとBの両方の特性を持つケースをサポートしなければならない場合や、あなたはAを持っていますが、Bはありません、あなたのコードは維持する悪夢です –

関連する問題