今天,我正在用Java创建一个Tetris克隆,当需要实现块生成机制时,我编写了这个带有枚举的switch语句。我被告知要尽可能避免使用switch语句,但是我不确定在这里是否可以避免使用switch语句,除非我彻底修改了我最初基于继承的设计选择。
为了实现不同类型的块,我决定制作一个名为Block的抽象超类,并为每种特定类型创建一个子类。我还做了一个枚举来标记块的类型。例如,一个ZBlock扩展Block对象将为它的Type字段变量分配Type.ZBlock枚举。
private void spawnBlock(Type type){
switch(type){
case I:
currentBlock = new IBlock();
break;
case L:
currentBlock = new LBlock();
break;
case J:
currentBlock = new JBlock();
break;
case Z:
currentBlock = new ZBlock();
break;
case S:
currentBlock = new SBlock();
break;
case T:
currentBlock = new TBlock();
break;
default:
currentBlock = new OBlock();
}
}
Run Code Online (Sandbox Code Playgroud)
当我开始考虑不使用switch语句的方法时,除了摆脱所有子类并在单个非抽象Block类中对不同块的行为进行编程之外,我别无选择。但是,由于不同的块具有不同的形状和壁球数据,可能会变得一团糟。那么在这里switch语句是一个不错的选择吗?如果没有,如何改善我的代码,为什么?
最初,我想出了一些排序算法以C ++进行编码以进行实践。人们告诉我这是非常低效的(实际上,对数百个数字进行排序大约需要10秒钟)。该算法是记住向量中的第一个元素(“枢轴”),然后解析每个其他元素,然后将每个元素移到枢轴的左侧(如果较小),否则将不执行任何其他操作。这会将列表分成较小的列表进行排序;其余的通过递归完成。
因此,现在我知道将列表分为两部分并进行这样的递归本质上是快速排序的工作(尽管如何进行分区有很多变体)。我不明白为什么我的原始代码效率低下,所以我写了一个新的代码。有人提到这是因为insert()和delete()函数,所以我确保不要使用那些,而要使用swap()。
旧(慢):
void sort(vector<T>& vec){
int size = vec.size();
if (size <= 1){ //this is the most basic case
return;
}
T pivot = vec[0];
int index = 0; //to help split the list later
for (int i = 1; i < size; ++i){ //moving (or not moving) the elements
if (vec[i] < pivot){
vec.insert(vec.begin(), vec[i]);
vec.erase(vec.begin() + i + 1);
++index;
}
}
if (index == 0){ //in case the 0th element is the smallest
vec.erase(vec.begin());
sort(vec); …
Run Code Online (Sandbox Code Playgroud)