我有这个代码,我需要重新编写并使其更漂亮。它从config.txt文件中读取行,并根据文件的内容设置变量。正如您所看到的,代码在很多方面都很难看。有很多重复的代码和程序检查文件内容的方式不是很优雅(它应该迭代线而不是检查文件是否包含特定的文本)。总的来说,我认为避免拥有一大块if / else块是很好的,这实际上会继续下去,但我觉得不需要包含所有这些块。
所有程序代码都是用一个main方法编写的,我想创建一些类。我在想一个应该处理配置文件读取的Config类,它会有一个行列表(Line对象可能?)并按顺序处理它们。我最近一直在阅读Strategy pattern和Command 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
答案 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;
}
}