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