首页 / JAVA / java – 你怎么能避免重复?
java – 你怎么能避免重复?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 你怎么能避免重复?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3500字,纯文字阅读大概需要6分钟。
内容图文
![java – 你怎么能避免重复?](/upload/InfoBanner/zyjiaocheng/726/06d47140d6364e1682fe64349f262370.jpg)
我正在使用Java,并试图在不同的情况下为不同的事情提供不同的任务,但有时它们会做同样的事情.这会导致一些重复(实际上是长行,而不是简短的方法名称),但是有一种简单的方法可以避免这些重复吗?
if(direction == Direction.UP) {
doThingA(); // same thing as down
doCustomThing1();
doSameThing(); // all do this
doCustomThing5();
} else if(direction == Direction.DOWN) {
doThingA();
doCustomThing2();
doSameThing();
doCustomThing6();
} else if(direction == Direction.RIGHT) {
doThingB() // same thing as left
doCustomThing3();
doSameThing();
doCustomThing7();
} else if(direction == Direction.LEFT) {
doThingB()
doCustomThing4();
doSameThing();
doCustomThing8();
}
下面是真正的代码,正如你所看到的,自定义的东西只是略有不同,但我不知道如何简化:
if(direction == Direction.UP) {
box.setAsBox(size.value/2, Constants.WORLD_HEIGHT/2);
bodyDef.position.set(new Vector2(rand.nextFloat()*(Constants.WORLD_WIDTH-size.value)+size.value/2, -Constants.WORLD_HEIGHT*0.5f));
body = gameWorld.world.createBody(bodyDef);
body.setLinearVelocity(new Vector2(0f, 5f));
} else if(direction == Direction.DOWN) {
box.setAsBox(size.value/2, Constants.WORLD_HEIGHT/2);
bodyDef.position.set(new Vector2(rand.nextFloat()*(Constants.WORLD_WIDTH-size.value)+size.value/2, Constants.WORLD_HEIGHT*1.5f));
body = gameWorld.world.createBody(bodyDef);
body.setLinearVelocity(new Vector2(0f, -5f));
} else if(direction == Direction.RIGHT) {
box.setAsBox(Constants.WORLD_WIDTH/2, size.value/2);
bodyDef.position.set(new Vector2(-Constants.WORLD_WIDTH*0.5f, rand.nextFloat()*(Constants.WORLD_HEIGHT-size.value)+size.value/2));
body = gameWorld.world.createBody(bodyDef);
body.setLinearVelocity(new Vector2(5f, 0f));
} else if(direction == Direction.LEFT) {
box.setAsBox(Constants.WORLD_WIDTH/2, size.value/2);
bodyDef.position.set(new Vector2(Constants.WORLD_WIDTH*1.5f, rand.nextFloat()*(Constants.WORLD_HEIGHT-size.value)+size.value/2));
body = gameWorld.world.createBody(bodyDef);
body.setLinearVelocity(new Vector2(-5f, 0f));
}
解决方法:
当我看到一个枚举作为switch语句中的一个条件,或者if-else梯形图,并且编写控制语句的人拥有枚举时,我认为这是代码味道.
考虑这个替代方案,为什么不使用你在其他地方做的相同的东西,而不是打开枚举?我建议你给多态性一个.
首先,如果没有对枚举有意义的默认实现,请使用一些抽象方法定义方向枚举.这与下面示例中的getWidth()相同.
其次,添加您可能想要的具有合理默认值的任何非抽象方法.然后,您可以像在普通Java多态中一样覆盖这些方法.这与下面示例中的getHeight()相同.
这种方法有很多优点.
>如果你想添加更多方向(假设你从4个方向转到8个方向,添加UP-LEFT,UP-RIGHT,DOWN-RIGHT,DOWN-LEFT),那么你不需要完成整个代码库和添加其他if-else语句.您只需在枚举中为这些新方向添加特定于实现的代码,您就完成了.一切正常.
>添加默认行为非常简单,您无需在代码库中的多个位置保持同步.
>您的调用代码中的代码行数会减少您拥有的枚举数量.如果您有10个枚举,并且必须为每个枚举编写10个调用,那么您将拥有121行代码(占调用和控制语句),但在开始使用多态之后,您将拥有10行代码(没有控制语句,只是方法调用).这应该会减少你的圈复杂度.
>您明确地将枚举的功能封装在枚举本身中.你必须要小心一点,如果你坚持这种方法,Enums最终会知道系统的太多部分,但通常我发现这不是问题.
方向枚举
public enum Direction {
UP {
public int getWidth() {
return 50;
}
@Override
public int getHeight() {
return 100;
}
},
DOWN {
public int getWidth() {
return 30;
}
};
public abstract int getWidth();
public int getHeight() {
return 10;
}
}
现在你的调用代码看起来像这样.
box.setAsBox(direction.getWidth(), direction.getSize());
bodyDef.position.set(direction.getPositionVector());
body = gameWorld.world.createBody(direction.getBody());
body.setLinearVelocity(direction.getLinearVelocity());
内容总结
以上是互联网集市为您收集整理的java – 你怎么能避免重复?全部内容,希望文章能够帮你解决java – 你怎么能避免重复?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。