面向对象的设计 - 当一个类中有大量数据字段时,封装有多重要?

2024-01-05

我有一个关于封装的问题:

当类有大量数据字段时是否建议使用封装?

使用以下类作为示例:

abstract public class Character {
    private String name;
    private String characterClass;
    private int level;
    private int hitDice;

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

    private int hp;
    private int currentHp;
    private int armorClass;
    private int BaseAttackBonus;

    private long xp;
    private double gp;

    private Inventory inventory;
    private double carriedWeight;

    private Equipment equipment;

    protected Character(String name) {

        setName(name);
        setCharacterClass("Class");
        setLevel(1);
        setHitDice(0);

        setStrength(10);
        setConstitution(10);
        setDexterity(10);
        setIntelligence(10);
        setWisdom(10);
        setCharisma(10);

        setHp((int) getLevel() * (getHitDice() + getModifier(getConstitution())));
        setCurrentHp(getHp());
        setArmorClass(10 + getModifier(getDexterity()));
        setBaseAttackBonus(0);

        inventory = new Inventory();
        setCarriedWeight(0);

        equipment = new Equipment();

        setXp(0);
        setGp(20);

    }

    protected Character(String name, int lvl) {

        setName(name);
        setCharacterClass("Class");
        setLevel(lvl);
        setHitDice(0);

        setStrength(10);
        setConstitution(10);
        setDexterity(10);
        setIntelligence(10);
        setWisdom(10);
        setCharisma(10);

        setHp((int) getLevel() * (getHitDice() + getModifier(getConstitution())));
        setCurrentHp(getHp());
        setArmorClass(10 + getModifier(getDexterity()));
        setBaseAttackBonus(0);

        inventory = new Inventory();
        setCarriedWeight(0);

        equipment = new Equipment();

        setXp(1000 * (getLevel() - 1));
        setGp(getLevel() * 20);

    }

    void displayCharacter() throws IOException {
        System.out.print("\n\n");
        System.out.println("Name: " + getName());
        System.out.println("Class: " + getCharacterClass());
        System.out.println("Level: " + getLevel());
        System.out.println("HP: " + getHp());
        System.out.println("Current HP: " + getCurrentHp());
        System.out.println("Armor Class: " + getArmorClass());
        System.out.println("Base Attack Bonus : +" + getBaseAttackBonus());

        System.out.println("***************");
        System.out.println("Attributes: ");
        System.out.println("Strength: " + getStrength());
        System.out.println("Constitution: " + getConstitution());
        System.out.println("Dexterity: " + getDexterity());
        System.out.println("Intelligence: " + getIntelligence());
        System.out.println("Wisdom: " + getWisdom());
        System.out.println("Charisma: " + getCharisma());
        System.out.println("***************");
        equipment.showEquipment();
        inventory.showInventory();
        System.out.println("Carried weight: " + getCarriedWeight());

        System.out.println("");
        System.out.println("XP: " + getXp());
        System.out.println("Gold: " + getGp());
        System.out.println("");

    }

    public int getModifier(int number) {
        int mod = (int) ((number - 10) / 2);
        return mod;
    }

    public String getName() {
        return name;
    }

    public String getCharacterClass() {
        return characterClass;
    }

    public int getLevel() {
        return level;
    }

    public int getHitDice() {
        return hitDice;
    }

    public int getStrength() {
        return strength;
    }

    public int getConstitution() {
        return constitution;
    }

    public int getDexterity() {
        return dexterity;
    }

    public int getIntelligence() {
        return intelligence;
    }

    public int getWisdom() {
        return wisdom;
    }

    public int getCharisma() {
        return charisma;
    }

    public int getHp() {
        return hp;
    }

    public int getCurrentHp() {
        return currentHp;
    }

    public int getArmorClass() {
        return armorClass;
    }

    public int getBaseAttackBonus() {
        return BaseAttackBonus;
    }

    public Equipment getEquipment() {
        return equipment;
    }

    public Inventory getInventory() {
        return inventory;
    }

    public double getCarriedWeight() {
        return carriedWeight;
    }

    public long getXp() {
        return xp;
    }

    public double getGp() {
        return gp;
    }

    protected void setName(String Name) {
        name = Name;
    }

    protected void setCharacterClass(String characterClass) {
        this.characterClass = characterClass;
    }

    protected void setLevel(int lvl) {
        level = lvl;
    }

    protected void setHitDice(int hd) {
        hitDice = hd;
    }

    protected void setStrength(int str) {
        strength = str;
    }

    protected void setConstitution(int con) {
        constitution = con;
    }

    protected void setDexterity(int dex) {
        dexterity = dex;
    }

    protected void setIntelligence(int intel) {
        intelligence = intel;
    }

    protected void setWisdom(int wis) {
        wisdom = wis;
    }

    protected void setCharisma(int cha) {
        charisma = cha;
    }

    protected void setHp(int hitPoints) {
        hp = hitPoints;
    }

    protected void setCurrentHp(int curHp) {
        currentHp = curHp;
    }

    protected void setArmorClass(int ac) {
        armorClass = ac;
    }

    protected void setBaseAttackBonus(int bab) {
        BaseAttackBonus = bab;
    }

    protected void setXp(int XP) {
        xp = XP;
    }

    protected void setGp(double GP) {
        gp = GP;
    }

    protected void setCarriedWeight(double weight) {
        carriedWeight = weight;
    }

    public void attack(Character target) {

        try {
            ((Weapon) getEquipment().getPrimaryHand()).attack(this, target);
        } catch (NullPointerException e) {
            getEquipment().equipPrimaryHand(
                    MeleeWeapon.meleeWeaponList.get(0)); /* equip fist weapon */
            ((Weapon) getEquipment().getPrimaryHand()).attack(this, target);

            if (target.getCurrentHp() <= 0) {
                System.out.println(target.getName() + " is down !");
            }
        }
    }

    public void equip() {
        getInventory().equip(this);
    }

    public void addToInventory(Item newItem) {
        getInventory().addToInventory(this, newItem);
    }

}

将大部分数据字段存储在不同的类中,例如strength and constitution in a Stats类,算不算是更好的设计?


我想你指的是分解 https://en.m.wikipedia.org/wiki/Decomposition_(computer_science)- 将大型系统分解为更小、更容易理解的部分的行为。

为了正确分解你的代码,你必须关注cohesion https://en.m.wikipedia.org/wiki/Cohesion_(computer_science):你们的班级代表了多少事物?他们“粘”在一起的程度如何?

你的类目前代表了很多东西:

  1. 角色身份信息,例如name
  2. 技能追踪器,例如constition
  3. 体验追踪器
  4. 存货
  5. 个人量表

你的 1 类代表多个实体;它的内聚力低。


所以为了回答你的问题,是的,将统计相关字段移动到统计类将是一件好事。但这不仅仅是你应该移动的领域,而是整个责任。这意味着如果您有resetStats()方法,它也会转到Stat class.

如果要移动的成员是private,因为它进一步隐藏了信息。但分解是它自己的主题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的设计 - 当一个类中有大量数据字段时,封装有多重要? 的相关文章

随机推荐

  • 在赋值 A(:) = B 中,A 和 B 中的元素数量必须相同

    例如 当尝试运行我的代码时 for ii 1 10 output ii rand 3 end 我收到错误 In an assignment A B the number of elements in A and B must be the
  • 目标 C:SHA1

    如何在 Objective c 中 sha1 一个字符串或一组数字 CommonCrypto Apple 框架 具有计算 SHA 1 哈希值的函数 包括一步哈希值 include
  • 给定 x、y 和色调,获取 HSL 值

    给定一个看起来像这样的颜色选择器 我正在尝试根据光标的 x 和 y 位置以及右侧滑块的色调来计算 HSL 值 我的数学技能相当薄弱 尽管我所拥有的很接近 但尝试获取真正浅的全强度颜色很麻烦 最终会变得太灰 这是我当前使用的功能 getHSL
  • C# 中使用反射进行方法拦截

    我编写了一个抽象类 它使用反射来查找构造函数中标有属性的字段 如下所示 AttributeUsage AttributeTargets Field public class TrackedField Attribute public cla
  • 定义频率上的音量 (C#)

    我不明白为什么音量定义的频率不符合预期 我依次将声音以几个指定的频率发送到麦克风 然后我对麦克风缓冲区进行 FFT 在 FFT 退出时 我有一个复数数组 要了解定义频率上的声音音量 我查看我的数组 该数组中的元素数量是这样得到的 MyFre
  • 使用 Java 在线程之间传输数据

    我正在编写一个模仿电影院的多线程应用程序 每个参与的人都是自己的线程 并发必须完全由信号量来完成 我遇到的唯一问题是如何基本上链接线程以便它们可以通信 例如通过管道 例如 Customer 1 是一个线程 它获取一个信号量 让它走到票房 现
  • VBA:使用两个参数调用 SQL Server 存储过程

    正如标题中提到的 我只想从 VBA 调用 SQL Server 存储过程 我可以这样调用我的存储过程 EXEC dbo spClientXLS Nr 131783 date 21 09 2014 Nr is a varChar 50 输入值
  • 如何在不使用 GlobalKey.currentState 的情况下平滑更新 Flutter AnimatedList?

    我发现的将项目插入 Flutter AnimatedList 的所有示例都利用 GlobalKey currentState 告诉 AnimatedList 小部件已插入项目 从列表中删除也是如此 众所周知 在 Flutter 中 Glob
  • 每个列表视图项目中旋转进度条

    我已经为此挠头很久了 并寻找答案但没有任何运气 这似乎是微不足道的 但据我所知 事实并非如此 我在 Android 应用程序中使用列表视图 其中每个项目 视图 在 内容已加载并显示 内容是通过http调用和json检索的 因此可能需要一段时
  • 如何摆脱 Core 中的“let”?

    我有一个在内部循环中频繁调用的函数 它看起来像这样 import qualified Data Vector Storable as SV newtype Timedelta Timedelta Double cklsLogDens SV
  • jQuery动态下拉框ajax

    我目前有两个下拉框和一个文本框 我使用数据库查询来填充第一个下拉框 并使用 ajax 来填充第二个下拉列表 具体取决于第一个下拉列表中选择的值 一旦从第二个下拉列表中选择了一个选项 我也会使用ajax来填充输入文本框 我的问题是 使用我当前
  • 使用 VB.Net 将数据插入 SQL Server 数据库

    我目前正在使用 HDI 会员提供商 设计如下所示 现在我尝试创建一个新用户并将这些值插入数据库 如下所示 Try Dim connectionString As String Data Source sqlexpress Initial C
  • 生成掷 n 个骰子的所有可能结果的矩阵(忽略顺序)

    在顺序确实很重要的情况下 生成所有可能结果的矩阵相当容易 执行此操作的一种方法是使用expand grid如图所示here https stackoverflow com questions 2889613 how can i find o
  • 防止 Adob​​e PDF 中的“另存为”

    我们需要防止保存网络驱动器上存在的 PDF 的额外副本 目前 我们已在格式允许的范围内 锁定 PDF 这意味着防止复制 粘贴 编辑和打印 但是 客户要求任何人在打开 PDF 后都无法创建该 PDF 的附加副本 使用本机 PDF 这是不可能的
  • 过渡组儿童必须被锁定......但他们被锁定

    尝试使用
  • HashMap 有大约 1 亿个键,时间仍然恒定?

    有谁知道这个问题的答案吗 是的 要搜索添加了 1 亿个项目的哈希映射 请执行以下操作 1 计算您要查找的对象的哈希值 2 找到那个桶3 在该存储桶中搜索该项目 1 与哈希映射的大小或其中的项数无关 2 是 O 1 假设标准哈希图实现为链表数
  • 将 UICollectionView 某些部分的触摸传递给底层视图

    First take a look at the attacthed image 我的层次结构如下所示 UIView UIButton UI集合视图 UICollectionViewCell UICollectionViewCell UIC
  • 为 EC2 实例保留相同的 IP 地址

    每次停止 启动实例时 EC2 实例是否会更改实例的 IP 地址 有没有办法保持IP地址不变 Yes 有一种方法 弹性IP寻址 https docs aws amazon com AWSEC2 latest UserGuide elastic
  • 有没有办法在 chrome 或 firebox 调试器的堆栈跟踪中隐藏第 3 方 JS 函数调用?

    这是我对 Chrome 调试器最喜欢的问题之一 我有一个调用第 3 方库的函数 该函数在内部调用 20 个其他函数 第 20 个库函数再次调用我的库中的另一个函数 我的函数A gt 调用 libFunctionA gt 调用 libFunc
  • 面向对象的设计 - 当一个类中有大量数据字段时,封装有多重要?

    我有一个关于封装的问题 当类有大量数据字段时是否建议使用封装 使用以下类作为示例 abstract public class Character private String name private String characterCla