如何重构这个凌乱的代码

时间:2015-07-24 08:20:23

标签: java

我有这个代码,我需要重新编写并使其更漂亮。它从config.txt文件中读取行,并根据文件的内容设置变量。正如您所看到的,代码在很多方面都很难看。有很多重复的代码和程序检查文件内容的方式不是很优雅(它应该迭代线而不是检查文件是否包含特定的文本)。总的来说,我认为避免拥有一大块if / else块是很好的,这实际上会继续下去,但我觉得不需要包含所有这些块。

所有程序代码都是用一个main方法编写的,我想创建一些类。我在想一个应该处理配置文件读取的Config类,它会有一个行列表(Line对象可能?)并按顺序处理它们。我最近一直在阅读Strategy patternCommand pattern之类的内容,并希望在这种情况下应用类似的内容,但我不确定这些内容是否恰当。如果有经验的人对此有任何意见我会非常感激!

    ...
    try {
        reader = new BufferedReader(new FileReader(pathToConfig));
        line = reader.readLine();
        while(line!=null){
            if(line.contains("//")|| line.equals(""));
            else{
                if(line.contains("inputFolderPath"))    {
                    pathToFolder=line.split("=")[1];
                }
                else if(line.contains("defaultOutputPath")){
                    defaultOutputPath=line.split("=")[1];
                }
                else if(line.contains("checkStyleAttribute")&&!line.contains("Path")){
                    lineAfterSplit=line.split("=")[1];
                    checkStyle=Boolean.parseBoolean(lineAfterSplit);
                    errorListStyleAttribute=new ArrayList<String>();
                }
                else if(line.contains("checkXrefAndNormalLinks")&&!line.contains("Path")){
                    lineAfterSplit=line.split("=")[1];
                    checkXref=Boolean.parseBoolean(lineAfterSplit);
                    errorListXref = new ArrayList<String>();
                }
                else if(line.contains("checkThatAllTopicsHaveConceptKeywords")&&!line.contains("Path")){
                    lineAfterSplit=line.split("=")[1];
                    checkThatAllTopicsHaveConceptKeywords=Boolean.parseBoolean(lineAfterSplit);
                    errorListConceptKeywords=new ArrayList<String>();
                }
                else if(line.contains("checkThatAllTopicsHaveIndexKeywords")&&!line.contains("Path")){
                    lineAfterSplit=line.split("=")[1];
                    checkThatAllTopicsHaveIndexKeywords=Boolean.parseBoolean(lineAfterSplit);
                    errorListIndexKeywords=new ArrayList<String>();
                }
                else if(line.contains("checkForNoUIElementsInHeadings")&&!line.contains("Path")){

                    lineAfterSplit=line.split("=")[1];
                    checkForNoUIElementsInHeadings=Boolean.parseBoolean(lineAfterSplit);
                    errorListUiElements=new ArrayList<String>();
                }
                else if(line.contains("whatElementToCheckForStyle")){
                    tag=line.split("=")[1];
                    if(tag.charAt(0)=='['){
                        tag=tag.substring(1, tag.length()-1);
                        String[] tags = tag.split(",");
                        for(int i=0;i<tags.length;i++){
                            tagsToCheck.add(tags[i]);
                        }
                    }


                    else if(tag.equals("all")){
                        checkEveryTag=true;
                    }
                    else{
                        tagsToCheck.add(tag);
                    }
                }
                else if(line.contains("checkForProductNamesWithoutDNTTag")&&!line.contains("Path")){
                    lineAfterSplit=line.split("=")[1];
                    checkForProductNamesWithoutDNTTag=Boolean.parseBoolean(lineAfterSplit);
                    errorProductNamesWithoutDNTTag=new ArrayList<String>();
                }
     ... and it just goes on

1 个答案:

答案 0 :(得分:0)

正如我所看到的,您的大多数代码都在进行重复性工作(检查是否有一些文本并对其执行某些操作。) 我建议你创建可插入的matchAndPerform方法。即将字符串匹配和相关的方法调用封装到一个类(策略模式)中,并有一些类可以动态注册和删除这些匹配器对象。

战略模式的例子:

public class Context {
   private Strategy strategy;
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}
public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}