簡體   English   中英

根據其他值設置對象的更優雅的方法

[英]A more elegant way of setting up an object based on other values

首先對這個標題的狀態表示歉意,我不知道我實際上要問的問題是什么,這意味着我不知道要使用的正確術語,因此如果有人可以告訴我我很樂意更改標題或刪除並重新發布。

因此,當前在一個項目中,我必須設置一個值對象,而忽略它是一個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。 因此,這些值已在另一個類中設置。 我不會粘貼整個類, 您可以在這里找到它,但是它具有以下值,這些值現在已經填寫完畢。

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

我想知道是否有一種更優雅的方式逐行運行該類,因此它首先遍歷每個類的int值,並在每個類上讀取Skills類中的每個String的Ability值,並通過檢索來設置技能值陳述的來自能力的字符串。 例如。 在讀取到acrobaticsAbility等於DEX時,它會去並獲取Dexterity值。

您應該創建一個具有3個屬性的類異能:標記異能,值異能和(靜態)異能。 該對象將替換每組3個屬性。 然后,您可以更改setValues以處理Ability對象的集合。 也許您只需要一個普通的setter並保持原樣即可。 或者,您可以使用以字符串功能為鍵的地圖。 這樣,您可以使用該鍵找到所需的能力。

您還可以將功能鍵放入枚舉中,例如AbilityType,這可以提高可讀性並減輕可能的錯字。 然后,靜態字符串將是靜態的AbilityType,地圖中的鍵的類型也將是靜態的。

我最好的選擇是在“技能”和“能力”類之間建立關系。

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

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

我沒有解決方案,因此可能沒有幫助。 相反,我有一些建議。

技能似乎有幾個“技能”條目。 您可以使用封裝在那里的三個屬性來創建一個Skill類。

然后,您將擁有包含多個技能條目的技能。 取而代之的是,您可以通過“能力”獲得一個技能圖,它可以是字符串常量(靜態最終字符串)或枚舉。

在這一點上,您可以消除Skill類,並通過“能力”獲得一個整數圖。 可以通過注意是否在地圖中找到鍵來替換“已標記”屬性。 但是,保留Skill類允許您向其添加其他屬性。

就簡化setValues()而言,這將涉及沿相同方向重構Abilities,以便您可以遍歷每個Ability並添加一個Skill。

作為粗略結構,請考慮以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM