java – 如何在减少重复代码的情况下为我的游戏添加Levels?
作者:互联网
我正在设计一个多层次的游戏.我有一个安装类,它根据收到的参数设置电路板,它指示应该设置的电平.这是班级:
public class BoardState {
public BoardState(InitialState state) {
switch (state) {
case EMPTY:
setupEmptyState();
break;
case INTEGRATIONTEST:
setupIntegrationTestState();
break;
case LEVEL_1:
setupLevelOne();
break;
case LEVEL_2:
setupLevelTwo();
break;
default:
throw new Error("Invalid level selection");
}
}
private void setupEmptyState() { }
private void setupIntegrationTestState() { }
private void setupLevelOne() { }
private void setupLevelTwo() { }
}
这工作正常,但每次我添加一个新的级别时,我必须在三个地方添加代码:InitialState枚举,它定义了接受状态列表,构造函数中的switch语句,以及类的主体,我必须在添加一个方法来设置相关级别.
我想要保留的一件好事是,我的GUI会根据定义级别列表的枚举自动填充我添加的每个级别的新按钮.
如何重构此代码,以便减少与添加新级别相关的开销?
最佳答案:
通常,当您需要减少代码重复时,就会出现一个界面.这一次(根据您在OP中的评论),您似乎需要根据您所在的级别向棋盘添加不同的对象:
import java.util.List;
public interface LevelSettings {
List<GameObject> startingObjects();
}
现在,BoardState看起来像那样(没有更多的setupX()方法)
import java.util.List;
public class BoardState {
private final List<GameObject> gameObjects;
public BoardState(LevelSettings settings) {
this.gameObjects = settings.startingObjects();
}
}
既然你也指定了一个很好的你有一个枚举动态创建GUI的按钮,你可以通过在枚举中实现接口来结合两全其美(界面和枚举)…
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY {
@Override
public List<GameObject> startingObjects() {
return Collections.emptyList();
}
},
INTEGRATIONTEST {
@Override
public List<GameObject> startingObjects() {
GameObject g1 = new GameObject("dummy 1");
GameObject g2 = new GameObject("dummy 2");
return Arrays.asList(g1, g2);
}
},
LEVEL_1 {
@Override
public List<GameObject> startingObjects() {
//read a config file to get the starting objects informations
//or also hardcoded (not preferred)
}
},
LEVEL_2 {
@Override
public List<GameObject> startingObjects() {
//read a config file to get the starting objects
//or also hardcoded (not preferred)
}
};
}
这基本上就是这样.如果你需要添加LEVEL_3,请在InitialState中执行,一切都将随之而来.
更进一步
从这里开始,它超出了你的要求,如果你不相信,可以随意忽略这一部分.
作为一种好的做法,我只将这些配置存储在配置文件中,以减少更多的代码重复并获得灵活性:
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY {
@Override
public List<GameObject> startingObjects() {
return readFromFile("empty.level");
}
},
INTEGRATIONTEST {
@Override
public List<GameObject> startingObjects() {
return readFromFile("integration_test.level");
}
},
LEVEL_1 {
@Override
public List<GameObject> startingObjects() {
return readFromFile("1.level");
}
},
LEVEL_2 {
@Override
public List<GameObject> startingObjects() {
return readFromFile("2.level");
}
};
private static List<GameObject> readFromFile(String filename) {
//Open file
//Serialize its content in GameObjects
//return them as a list
}
}
因此,当您决定添加新级别时,实际上只需要知道存储级别配置的文件名.
再向前迈进一步
您将看到的内容非常棘手,我建议您不要在生产代码中使用它(但它会减少代码重复)!
import java.util.List;
public enum InitialState implements LevelSettings {
EMPTY, INTEGRATIONTEST, LEVEL_1, LEVEL_2;
@Override
public List<GameObject> startingObjects() {
return readFromFile(this.name() + ".level");
}
private static List<GameObject> readFromFile(String filename) {
//Open file
//Serialize its content in GameObjects
//return them as a list
}
}
在这里,我们依靠枚举名称来找到相应的正确文件.此代码有效,因为它基于约定,即文件的名称相应于具有“.level”扩展名的枚举名称.当你需要添加一个新级别时,只需将它添加到枚举中就可以了……
标签:java,oop,design-patterns,code-duplication 来源: https://codeday.me/bug/20190516/1114519.html