2015-04-01 21 views
0

我正在和一位朋友一起开发基于Java的游戏,并且我注意到他正在采取一种涉及到我的方法,就可维护性而言。Setter方法,多个没有参数或单个值?

对于代表可播放的Character的类,不是创建1个设置对象属性的方法,而是创建将属性设置为特定值的单独方法。

这2个选项中的哪一个最适合继续前进?

  • 选项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; 
    } 
    
+2

俩!添加你的方法并添加一个通用的setter方法 – 2015-04-01 21:48:52

回答

1

为什么不使用枚举的速度给定 - 那么你仍然可以有

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; 
    } 
} 

这样,您可以快速更新值,但仍有一个预定义的数量。其灵活且易于维护。您可能想要保存枚举而不是浮点数。

0

IMHO最好办法是声明常量/枚举和使用选项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); 
+0

这是使用Consts还是你想解释枚举? setSpeed(STOP | WALK | FAST); – 2015-04-01 22:49:22

+0

@YazadKhambata这行在** Example(常量)中被调用:**以锚点分隔,不能更清晰。如果你真的想要付出代价,我可以用这种冷静的态度。 – 2015-04-01 22:50:07

0

我的解决方案是使用枚举代替,

它是清洁,有更多的情况下,如果你有更多的事情要做,将来你的速度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; 
    } 
}; 
0

这取决于。例如

  • 速度是否限于几个预定义值?在这种情况下,使用enum将是一个很好的解决方案。

  • 行走/跑步/停止进行除了设置速度之外是否有副作用?作为一个人为的例子,开始跑步可能会导致角色掉落它所持有的物品,或停止可能会导致角色滑行一点。在这种情况下,单独的方法可能有意义。

  • 或者也许只有一些预定义的状态,但取决于环境运行速度可能会有所不同。

结论是:哪种方式在概念上塑造角色的属性最适合您的游戏逻辑/物理?解决这个问题,然后基于你的类的接口。不要太早挂在确切的API上,这种东西很容易重构。

0

当你希望你的代码是可读的,并且避免公共类的字段可以从另一个类以错误的方式使用时,getter和setter很有用。 这个例子显示了如何是重要的。

CLASS A:

public class ClassA{  
// in the body class 
private String fieldClass1; 

//classic setter 
public void setfieldClass1(String f1) 
{ 
fieldClass1 = f1; 
} 

}

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 
} 
} 

这意味着必须定义一个 “改性剂逻辑” (受保护的,私人的,公共的c)在制造者和获得者之前。在修饰符之前和定义setters和getters之后定义。

相关问题