Setter 方法,多个没有参数或单个有值?
Setter methods, multiple with no parameters or single with value?
我正在和一个朋友一起开发基于 java 的游戏,我注意到他采用的方法在可维护性方面与我有关。
对于表示可播放 Character
的 class,他不是只创建 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;
}
恕我直言,最好的选择是声明 constants/enums,并使用选项 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);
为什么不使用枚举来设置速度 - 那么你仍然可以
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;
}
}
这样,您可以快速更新值,但仍然有预定义的数量。它灵活且易于维护。您可能想要保存枚举而不是浮点数。
我的解决方案是改用枚举,
如果您将来对速度 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;
}
};
视情况而定。例如
速度是否受限于几个预定义的值?在这种情况下,使用 enum
将是一个很好的解决方案。
步行/运行宁/停止除了设置速度外还有副作用吗?举个人为的例子,开始 运行 可能会导致角色掉落它持有的物品,或者停止可能会导致角色稍微打滑。在这种情况下,使用单独的方法可能是有意义的。
- 或者可能只有几个预定义的状态,但是根据环境运行宁速度可能会有所不同。
归结为:哪种对角色属性进行概念建模的方式最适合您的游戏逻辑/物理?解决这个问题,然后将 类 的界面基于此。不要太在意早期的确切 API,这类东西很容易重构。
getter 和设置器在您希望代码可读并避免 public class 字段以错误的方式从另一个 class是的。
这个例子说明了重要性。
CLASS答:
public class ClassA{
// in the body class
private String fieldClass1;
//classic setter
public void setfieldClass1(String f1)
{
fieldClass1 = f1;
}
}
CLASS乙:
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
}
}
这意味着您必须在 make setter 和 getter 之前定义一个 "modifiers logic"(受保护的、私有的、public)。在修饰符之前定义,在定义设置器和 getter 之后定义。
我正在和一个朋友一起开发基于 java 的游戏,我注意到他采用的方法在可维护性方面与我有关。
对于表示可播放 Character
的 class,他不是只创建 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; }
恕我直言,最好的选择是声明 constants/enums,并使用选项 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);
为什么不使用枚举来设置速度 - 那么你仍然可以
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;
}
}
这样,您可以快速更新值,但仍然有预定义的数量。它灵活且易于维护。您可能想要保存枚举而不是浮点数。
我的解决方案是改用枚举,
如果您将来对速度 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;
}
};
视情况而定。例如
速度是否受限于几个预定义的值?在这种情况下,使用
enum
将是一个很好的解决方案。步行/运行宁/停止除了设置速度外还有副作用吗?举个人为的例子,开始 运行 可能会导致角色掉落它持有的物品,或者停止可能会导致角色稍微打滑。在这种情况下,使用单独的方法可能是有意义的。
- 或者可能只有几个预定义的状态,但是根据环境运行宁速度可能会有所不同。
归结为:哪种对角色属性进行概念建模的方式最适合您的游戏逻辑/物理?解决这个问题,然后将 类 的界面基于此。不要太在意早期的确切 API,这类东西很容易重构。
getter 和设置器在您希望代码可读并避免 public class 字段以错误的方式从另一个 class是的。 这个例子说明了重要性。
CLASS答:
public class ClassA{
// in the body class
private String fieldClass1;
//classic setter
public void setfieldClass1(String f1)
{
fieldClass1 = f1;
}
}
CLASS乙:
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
}
}
这意味着您必须在 make setter 和 getter 之前定义一个 "modifiers logic"(受保护的、私有的、public)。在修饰符之前定义,在定义设置器和 getter 之后定义。