如果条件重构多个

时间:2014-08-11 22:10:33

标签: java refactoring

我创建了一个方法,其中我有多个if条件。现在我想重构这些条件。在条件允许的情况下克服多重的最佳设计模式/策略是什么?

 if
        (
            poConfiguration.strSampleLoaderPluginClass != null
            && poConfiguration.strSampleLoaderPluginClass.equals("") == false
        )
        {
            setSampleLoaderPluginClass(poConfiguration.strSampleLoaderPluginClass);
        }

        if
        (
            poConfiguration.strPreprocessingPluginClass != null
            && poConfiguration.strPreprocessingPluginClass.equals("") == false
        )
        {
            setPreprocessingPluginClass(poConfiguration.strPreprocessingPluginClass);
        }

        if
        (
            poConfiguration.strFeatureExtractionPluginClass != null
            && poConfiguration.strFeatureExtractionPluginClass.equals("") == false
        )
        {
            setFeatureExtractionPluginClass(poConfiguration.strFeatureExtractionPluginClass);
        }

        if
        (
            poConfiguration.strClassificationPluginClass != null
            && poConfiguration.strClassificationPluginClass.equals("") == false
        )
        {
            setClassificationPluginClass(poConfiguration.strClassificationPluginClass);
        }

如果可能的话,请与实施分享您的想法。提前致谢

2 个答案:

答案 0 :(得分:0)

我的第一个想法是多态(Click here for more info),它取决于具体情况:

interface MyInterface {
    public boolean checkCondition(PoConfiguration poConfiguration);

    public void process(PoConfiguration poConfiguration);
}

public class SampleLoader implements MyInterface {
    public boolean checkCondition(PoConfiguration poConfiguration) {
       return poConfiguration.strSampleLoaderPluginClass != null
        && !poConfiguration.strSampleLoaderPluginClass.isEmpty();
    }

    public void process(PoConfiguration poConfiguration) {
        setSampleLoaderPluginClass(poConfiguration.strSampleLoaderPluginClass); 
    }
}

public class ClientAPI {
    public void caller() {
         for (MyInterface current : this.myInterfaces) {
             if (current.checkCondition(current)) {
                 current.process();
             }
         }
}

答案 1 :(得分:0)

您可以尝试以下内容:

  • 创建包含Configuration
  • ConfigurationItems
  • 每个ConfigurationItem都有一个名称,值和一个默认值

作为改进,您可能希望为配置项创建静态值,而不是使用字符串。

TestConfig主类

package com.example.config;

public class TestConfig {
    static TestConfig me;
    static String[][] confSettings = {{"sampleLoader","loaderDefault"}
                                     ,{"preProcessing","preProcessingDefualt"}
                                     ,{"featureExtraction","featureExtractionDefault"}
                                     ,{"classification","classificationDefault"}
                                     };

    // Object fields
    Configuration configuration;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        me = new TestConfig();
        me.doWork();



    }

    private void doWork() {
        configuration = new Configuration();
        for (int i=0; i < confSettings.length; i++) {
            configuration.addConfigurationItem(confSettings[i][0], confSettings[i][1], null);
        }

        configuration.setConfigurationItemDefault("classification", "newValue");

        System.out.println("sampleLoader = " + configuration.getConfigurationItemValue("sampleLoader"));

        System.out.println("classification = " + configuration.getConfigurationItemValue("classification"));


    }
}

配置类

package com.example.config;

import java.util.ArrayList;
import java.util.HashMap;

public class Configuration {
    // Class fields
    // Object fields
    HashMap<String,Integer> itemNames;

    ArrayList<ConfigurationItem> items;

    public Configuration() {
        items = new ArrayList<ConfigurationItem>();
        itemNames = new HashMap<String,Integer>();
    }

    public Configuration addConfigurationItem(String name, String defaultValue, String value) {
        if (itemNames.containsKey(name)) {
            // handle duplicate configuration item
        } else {
            items.add(new ConfigurationItem(name, defaultValue, value));
            Integer loc = new Integer(items.size()-1);
            itemNames.put(name, loc);
        }
        return this;
    }

    public void setConfigurationItemDefault(String name, String defaultValue) {

        int loc = getConfigurationItemIndex(name); 
        if (loc > -1) {
            items.get(loc).setDefaultValue(defaultValue);
        }
    }

    public String getConfigurationItemValue(String name) {
        int loc = getConfigurationItemIndex(name);
        if (loc > -1) {
            return items.get(loc).getValue();
        } else {
            // handle unknown parameter
            return null;
        }
    }

    private int getConfigurationItemIndex(String name) {
        if (itemNames.containsKey(name)) {
            return itemNames.get(name);
        } else {
            // handle unknown parameter
            return -1;
        }
    }
}

ConfigurationItem类

package com.example.config;

public class ConfigurationItem {
    // Object fields
    String name;
    String value;
    String defaultValue;

    public ConfigurationItem(){};
    public ConfigurationItem(String name, String defaultValue, String value) {
        this.setName(name).setDefaultValue(defaultValue).setValue(value);
    }

    public ConfigurationItem setName(String name) {
        this.name = name;
        return this;
    }
    public ConfigurationItem setValue(String value) {
        this.value = value;
        return this;
    }
    public ConfigurationItem setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
        return this;
    }

    public String getValue() {
        if (value == null || value.length() == 0) {
            return defaultValue;
        } else {
            return value;
        }
    }
}