2015-04-01 65 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之後定義。

相關問題