2017-06-12 2 views
0

Zuerst entschuldigen Sie den Zustand dieses Titels, ich weiß nicht, was die Frage ist, die ich eigentlich stelle, was bedeutet, dass ich die richtige Terminologie nicht kenne wenn jemand mir sagen könnte, dass ich glücklich wäre, den Titel zu ändern oder zu löschen und neu zu veröffentlichen.Eine elegantere Art, ein Objekt basierend auf anderen Werten einzurichten

Also gerade in einem Projekt, das ich tue, muss ich ein Objekt von Werten aufstellen, die Tatsache ignorieren, dass es ein realmObject ist, spielt keine Rolle.

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

Wie Sie STR, DEX eine Fähigkeit Wert jeder von ihnen haben sehen können, CON, INT, WIS, CHA. Ja, es ist D & D. Also diese Werte wurden in einer anderen Klasse eingerichtet. Ich werde nicht die ganze Klasse einfügen you can go find it here, aber es hat die folgenden Werte, die an diesem Punkt bereits ausgefüllt werden.

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

Derzeit Ich gründe die Werte wie diese

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

Ich möchte wissen, ob es eine elegantere Art und Weise ist diese Klasse Zeile für Zeile zu laufen, so wird es erst durch jede der Klassen Werte int und lese jeweils die Fähigkeits-Werte der Klasse in der Skills-Klasse und setze den Skills-Wert, indem du den angegebenen String aus den Fähigkeiten abrufst. z.B. Nach dem Lesen, dass acrobaticsAbility gleich DEX ist, geht es und ruft den Dexterity-Wert ab.

+0

Optionen gehören - 1) Setzen Sie die Fähigkeiten Klasse nicht kopieren. Referenzieren Sie es einfach. 2) Benutze eine Karte von der Fähigkeit enum zum Wert. Kopieren Sie einfach die Karte. –

Antwort

1

Sie sollten eine Klasse Fähigkeit mit 3 Eigenschaften erstellen: markiert, Wert und (statische) Fähigkeit. Dieses Objekt ersetzt jeden Satz von 3 Eigenschaften. Dann können Sie setValues ​​ändern, um eine Sammlung von Fähigkeitsobjekten zu behandeln. Vielleicht brauchen Sie nur einen normalen Setter und behalten Sie die Sammlung so wie sie ist. Oder Sie können eine Karte verwenden, in der Sie die String-Fähigkeit als Schlüssel haben. Auf diese Weise können Sie die benötigte Fähigkeit mit diesem Schlüssel finden.

Sie können auch die Fähigkeitsschlüssel in eine Enum setzen, z. AbilityType, verbessert die Lesbarkeit und mindert mögliche Tippfehler. Dann ist der statische String ein statischer AbilityType und der Typ des Schlüssels in Ihrer Map.

0

Meine beste Wette wäre, eine Beziehung zwischen den Skills und den Ability-Klassen zu erstellen.

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

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

Das Problem damit ist, dass Fähigkeit in viele andere Klassen nicht nur Fähigkeiten einspeist –

+1

Das ist kein Problem. Es ist eine Funktion. Übergeben Sie eine vorhandene Fähigkeitsinstanz in Ihren Skills-Konstruktor, wo Sie sie als Referenz speichern. Wenn deine anderen Klassen deine Fähigkeitswerte erhöhen/verringern, werden deine Fähigkeiten entsprechend erhöht/verringert, ohne dass du etwas tun musst. – phatfingers

+0

ja @phatfingers Vorschlag ist genau das, was ich sagen wollte. Ich kann meine Antwort bearbeiten, wenn Sie mich brauchen, um in einen Konstruktor mit Fähigkeitsobjekt zu passen. –

0

Ich habe keine Lösung, daher kann dies nicht hilfreich sein; eher habe ich ein paar Vorschläge.

Fähigkeiten scheint mehrere "Fähigkeit" Einträge zu haben. Sie könnten eine Skill-Klasse mit den drei darin eingekapselten Attributen erstellen.

Sie hätten dann Skills mit mehreren Skill-Einträgen. Stattdessen könntest du eine Fähigkeitskarte haben, die entweder eine String-Konstante (statische finale Zeichenfolge) oder eine Enumeration sein kann.

An diesem Punkt können Sie möglicherweise die Skill-Klasse eliminieren und haben eine Karte von Integer nach "Fähigkeit". Die "markierte" Eigenschaft könnte ersetzt werden, indem festgestellt wird, ob der Schlüssel in der Karte gefunden wird. Wenn Sie jedoch die Skill-Klasse beibehalten, können Sie ihr weitere Eigenschaften hinzufügen.

Soweit wir setValues ​​() vereinfachen, würde dies die Refactoring-Fähigkeiten entlang derselben Linie beinhalten, so dass Sie jede Fähigkeit durchlaufen und eine Fähigkeit hinzufügen könnten.

+0

Wenn Sie mit dem Verlust des Wertes leben können, wenn eine Fähigkeit nicht markiert ist, dann ist dies in der Tat eine noch bessere Lösung als meine. Das Parameterset wird eins, sodass die 'extra' Skill-Klasse nicht mehr benötigt wird. Wenn Sie in der Lage sind, eine Fähigkeit zu markieren und dann den alten Wert verfügbar zu haben, ist diese letzte Option nicht möglich. –

0

Als grobe Struktur ist folgendes zu beachten:

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

Und:

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