我正和一位朋友一起开发基于Java的游戏,我注意到他在可维护性方面采取了一种让我感到担忧的方法。
对于表示可播放Character
的类,他不是创建一个设置对象属性的方法,而是创建单独的方法,将属性设置为特定值。
这两个选项中哪一个最适合继续前进?
选项1
public void runFast() {
this.character.speed = 5.0f
}
public void walk() {
this.character.speed = 2.0f
}
public void stop() {
this.character.speed = 0.0f;
}
选项2
public void setSpeed(float speedTemp) {
this.character.speed = speedTemp;
}
答案 0 :(得分:2)
为什么不使用枚举来设置速度 - 然后你仍然可以
void setSpeed(Speed speed) {
this.character.speed = speed.getAmount();
}
使用:
enum Speed {
FAST(5.0f), WALK(2.0f), STOP(0.0f);
private final float amount;
private Speed(flaot a) { this.amount = a; }
public float getAmount() {
return amount;
}
}
这样,您可以快速更新值,但仍具有预定义的数量。它灵活且易于维护。您可能希望保存枚举而不是浮点数。
答案 1 :(得分:1)
恕我直言,最好的选择是声明常量/枚举,并使用选项2。
示例(常量):
public static final float STOP = 0.0f;
public static final float WALK = 2.0f;
public static final float FAST = 5.0f;
setSpeed(STOP|WALK|FAST);
示例(枚举):
public enum Speed
{
FAST(5.5f),
STOP(0),
WALK(2.5f);
float value;
Speed(float pValue)
{
this.value = pValue;
}
public float getValue()
{
return this.value;
}
}
setSpeed(Speed.FAST);
答案 2 :(得分:1)
我的解决方案是使用枚举,
如果你将来更多地关注你的速度maxHeartRate,那么它更干净,具有更多的上下文并且易于扩展。public class Character {
private Speed speed;
public Speed getSpeed() {
return speed;
}
public void setSpeed(Speed speed) {
this.speed = speed;
}
};
public enum Speed {
STOP(0),
RUN(5.5),
WALK(2.5);
double value;
Speed(double value) {
this.value = value;
}
public double getValue() {
return value;
}
};
答案 3 :(得分:0)
这取决于。例如
速度是否仅限于几个预定义值?在这种情况下,使用enum
将是一个很好的解决方案。
走路/跑步/停止走路除了设定速度外还有副作用吗?作为一个人为的例子,开始运行可能会导致角色掉落它所持有的物品,或者停止可能会导致角色滑动一点。在这种情况下,使用单独的方法可能有意义。
归结为:哪种概念上对角色属性进行建模的方式最适合您的游戏逻辑/物理?解决这个问题,然后将类的接口基于此。不要在早期对确切的API过于依赖,这种东西很容易重构。
答案 4 :(得分:0)
getter和setter非常有用。 这个例子说明了重要性。
CLASS A:
public class ClassA{
// in the body class
private String fieldClass1;
//classic setter
public void setfieldClass1(String f1)
{
fieldClass1 = f1;
}
}
CLASS B:
public class ClassB{
// in the bodyclass
public String fieldClass2;
//classic setter
public void setfieldClass2(String f2)
{
setfieldClass2 = f2;
}
CLASS C:
public class ClassC{
//in the body of the class this method use class a and class b
public void calc()
{
ClassA aObject = new ClassA();
ClassB bObject = new ClassB();
ClassA.fieldClass1 = 5 + 5; // illegal expression for the compiler and costrain the developer to use setters
ClassB.fieldClass2 = 8 + 8; // legal expression
}
}
这意味着您必须定义一个"修饰符逻辑" (保护,私人,公共)制作制定者和吸气者之前。在修改器之前定义以及定义setter和getter之后。