2017-06-12 52 views
0

首先對此標題的狀態表示歉意,我不知道我實際問的是什麼問題,這意味着我不知道使用的正確術語如果有人可以告訴我,我很樂意改變標題或刪除並重新發布。根據其他值設置對象的更優雅的方式

因此,目前在一個項目中,我正在做的事情是我不得不建立一個值的對象,忽略它是realmObject這一事實,這無關緊要。

public class Skills extends RealmObject { 

    private boolean acrobaticsMarked = false; 
    private int acrobaticsValue; 
    private final String acrobaticsAbility = "DEX"; 

    private boolean animalHealingMarked = false; 
    private int animalHealingValue; 
    private final String animalHealingAbility = "WIS"; 

    private boolean arcanaMarked = false; 
    private int arcanaValue; 
    private final String arcanaAbility = "INT"; 

    private boolean athleticsMarked = false; 
    private int athleticsValue; 
    private final String athleticsAbility = "STR"; 

    private boolean deceptionMarked = false; 
    private int deceptionValue; 
    private final String deceptionAbility = "CHA"; 

    private boolean historyMarked = false; 
    private int historyValue; 
    private final String historyAbility = "INT"; 

    private boolean insightMaarked = false; 
    private int insightValue; 
    private final String insightAbility = "WIS"; 

    private boolean intimidationMarked = false; 
    private int intimidationValue; 
    private final String intimidationAbility = "CHA"; 

    private boolean investigationMarked = false; 
    private int investigationValue; 
    private final String investigationAbility = "INT"; 

    private boolean medicineMarked = false; 
    private int medicineValue; 
    private final String medicineAbility = "WIS"; 

    private boolean natureMarked = false; 
    private int natureValue; 
    private final String natureAbility = "INT"; 

    private boolean perceptionMarked = false; 
    private int perceptionValue; 
    private final String perceptionAbility = "WIS"; 

    private boolean performanceMarked = false; 
    private int performanceValue; 
    private final String performanceAbility = "CHA"; 

    private boolean persuasionMarked = false; 
    private int persuasionValue; 
    private final String persuasionAbility = "CHA"; 

    private boolean religionMarked = false; 
    private int religionValue; 
    private final String religionAbility = "INT"; 

    private boolean sleightOfHandMarked = false; 
    private int sleightOfHandValue; 
    private final String sleightOfHandAbility = "DEX"; 

    private boolean stealthMarked = false; 
    private int stealthValue; 
    private final String stealthAbility = "DEX"; 

    private boolean survivalMarked = false; 
    private int survivalValue; 
    private final String survivalAbility = "WIS"; 

正如你所看到的每一個這些有能力值 STR,DEX,CON,INT,WIS,CHA。是的,這是D & D. 所以這些值已經在另一個類中設置。我不打算粘貼全班you can go find it here,但它具有以下值,這些值已經在此處填寫完畢。

int strength; 
int dexterity; 
int constitution; 
int intelligence; 
int wisdom; 
int charisma; 

目前我設定值這樣

public void setValues(Abilities abilities) { 
    this.setAcrobaticsValue(abilities.getDexterity()); 
    this.setAnimalHealingValue(abilities.getWisdom()); 
    this.setArcanaValue(abilities.getIntelligence()); 
    this.setAthleticsValue(abilities.getStrength()); 
    this.setDeceptionValue(abilities.getCharisma()); 
    this.setHistoryValue(abilities.getIntelligence()); 
    this.setInsightValue(abilities.getWisdom()); 
    this.setIntimidationValue(abilities.getCharisma()); 
    this.setInvestigationValue(abilities.getIntelligence()); 
    this.setMedicineValue(abilities.getWisdom()); 
    this.setNatureValue(abilities.getIntelligence()); 
    this.setPerceptionValue(abilities.getWisdom()); 
    this.setPerformanceValue(abilities.getCharisma()); 
    this.setPersuasionValue(abilities.getCharisma()); 
    this.setReligionValue(abilities.getIntelligence()); 
    this.setSleightOfHandValue(abilities.getDexterity()); 
    this.setStealthValue(abilities.getDexterity()); 
    this.setSurvivalValue(abilities.getWisdom()); 
} 

我想知道是否有運行由線這班線更優雅的方式,因此首先通過每個類的詮釋值並在每一個閱讀技能類中的每個字符串的能力值,並通過從能力中檢索所述的字符串來設置技能值。例如。在閱讀acrobaticsAbility與DEX相同時,它會檢索敏捷值。

+0

選項包括 - 1)不要複製能力一流。只需參考它。 2)使用從能力枚舉到值的映射。只需複製地圖。 –

回答

1

你應該創建一個具有3個屬性的能力:標記,值和(靜態)能力。該對象將替換每組3個屬性。然後,您可以更改setValues來處理Ability對象的集合。也許你只需要一個普通的setter並保持原樣。或者你可以使用地圖,在那裏你有字符串能力作爲關鍵。通過這種方式,您可以使用該鍵找到所需的能力。

您還可以將鍵放入枚舉中,例如AbilityType,這可以提高可讀性並減少可能的錯字。那麼靜態字符串將是一個靜態的AbilityType,並且這將是您的映射中鍵的類型。

0

我最好的辦法是創建技能和能力類之間的關係。

public class Skills extends RealmObject { 
    // Remove all fields that can be obtained from ability 
    private Ability ability; 

    public int getAcrobaticsValue(){ 
    return ability.getWisdom(); 
} 
} 
+0

這個問題就是能力不僅僅是技能 –

+1

這個問題。這是一個功能。將現有的Ability實例傳遞到您的Skills構造函數中,並將其作爲參考進行存儲。如果你的其他職業增加/減少你的能力值,那麼你的技能會相應地增加/減少,而不需要你做任何事情。 – phatfingers

+0

是的@phatfingers建議正是我要說的。我可以編輯我的答案,如果你需要我適應具有Ability對象的構造函數。 –

0

我沒有解決方案,所以這可能沒有幫助;相反,我有一些建議。

技能似乎有幾個「技能」條目。您可以創建一個Skill類,其中包含三個屬性。

然後,您將擁有多項技能條目的技能。相反,你可以通過「能力」來獲得技能地圖,這可以是一個字符串常量(靜態最終字符串)或枚舉。

在這一點上,你可能會消除技能類,並通過「能力」有一個整數地圖。 「標記」屬性可以通過注意是否在地圖中找到密鑰來取代。但是,保持Skill類可以讓你添加其他屬性。

就簡化setValues()而言,這將涉及重構能力沿着相同的行,以便你可以遍歷每個技能並添加一個技能。

+0

如果你可以忍受失去價值,當一個技能是未標記的,那麼這確實是一個比我更好的解決方案。參數集將成爲一個,所以'額外'技能類不再需要。如果您需要能夠標記技能,然後獲得舊值,則最後一個選項是不可能的。 –

0

粗糙結構考慮以下幾點:

public class Abilities{ 

     enum Ability {DEXTERITY, WISDOM; }//add more 

     private Map<Ability, Integer> abilities; 

     public Abilities(){ 
      abilities = new HashMap<>(); 
     } 

     public int getValue(Ability ability) { 
      return abilities.get(ability); 
     } 

     public void setValue(Ability ability, int value) { 
      abilities.put(ability, value); 
     } 
    } 

和:

public class Skills { 

    enum SkillName{DEX, WIS, INT, STR, CHA;} 

    private Skill acrobatics; 
    private Skill animalHealing; 
    private Abilities abilities; 

    Skills(){ 
     abilities = new Abilities(); 
     abilities.setValue(Ability.DEXTERITY, 5); 
     abilities.setValue(Ability.WISDOM, 3); 
     acrobatics = new Skill(SkillName.DEX, Ability.DEXTERITY, false); 
     animalHealing = new Skill(SkillName.WIS, Ability.WISDOM, false); 
    } 

    public boolean isFlag(Skill skill) { 
     return skill.isFlag(); 
    } 

    public void setFlag(Skill skill, boolean flag) { 
     skill.setFlag(flag); 
    } 

    public int getValue(Skill skill) { 
     return skill.getValue(); 
    } 

    public void setValue(Skill skill, int value) { 
     skill.setValue(value); 
    } 

    class Skill{ 

     private SkillName name; 
     private Ability ability; 
     boolean flag; 

     Skill(SkillName name, Ability ability, Boolean flag){ 

      this.name = name; 
      this.ability = ability; 
      this.flag = flag; 
     }; 

     public boolean isFlag() {return flag;} 
     public void setFlag(boolean flag) { this.flag = flag;} 
     public int getValue() { return abilities.getValue(ability);} 
     public void setValue(int value) {abilities.setValue(ability,value);} 
     public String getName() {return name.toString();} 
     public void setName(SkillName name) {this.name = name; } 
    } 
}