Java OOP:构建对象树/对象族

Java OOP:构建对象树/对象族,java,oop,Java,Oop,我已经有一段时间没有使用Java了,我想知道这是否是一种体面甚至正确的设置方式 仅供参考,userResults指的是下面代码中不存在的JDBI变量 欢迎提出更好的方法,谢谢 public class Stat { private int current; private int max; public int getCurrent() {return current;} public void setCurrent(int current) {this.current = curren

我已经有一段时间没有使用Java了,我想知道这是否是一种体面甚至正确的设置方式

仅供参考,userResults指的是下面代码中不存在的JDBI变量

欢迎提出更好的方法,谢谢

public class Stat
{
private int current;
private int max;

public int getCurrent()  {return current;}
public void setCurrent(int current)   {this.current = current;}

public int getMax()  {return max;}
public void setMax(int max)   {this.max = max;}
}


public class Character
{
Stat hp = new Stat();
Stat mp = new Stat();
}

Character thisCharacter = new Character();

// Set the value of current & max HP according to db data.
thisCharacter.hp.setCurrent((Integer) userResults.get("hpColumn1"));
thisCharacter.hp.setMax((Integer) userResults.get("hpColumn2"));

// Print test values
System.out.println (thisCharacter.hp.Current);
System.out.println (thisCharacter.hp.Max);

这不是一棵真正的树。这是不可能的两个有超过一层的孩子

通常您定义一个接口,我们称之为
节点
,其中
Stat
Character
都实现了它,并且
Character
的两个子节点的类型是
节点
正确吗?好吧,行吗?那么它可能是正确的

不管这是不是一种体面的方式,答案都是“也许”。很难从这段代码所处的上下文中分辨出来。但有些事情你可以记住:

  • Stat
    设置在哪个类(或者更确切地说是对象)中?您是否觉得这是类的责任,并且知道从哪些数据库值获取它们?如果不是,考虑制作一个这样的类。
  • 进行链接调用,例如
    thischacter.hp.setCurrent(…)
    ,违反了。有时你会情不自禁,但通常会导致代码混乱。考虑拥有处理统计数据周围所有逻辑的东西。在代码中,您可能需要一个
    HealthStatsHandler
    ,该处理程序具有
    loadStats()
    saveStats()
    等方法,以及
    takeDamage(int-dmg)
    恢复(int-health)
    等变异操作
  • 如果你很难弄清楚它是否有正确的对象设计,那么就研究一下。它们提供了很好的指导原则,任何开发人员都应该遵循这些指导原则,如果他们想要拥有可扩展且“干净”的代码的话

我会考虑单独创建STAT对象并将它们传递到字符中,并使字符属性私有化如下:

public class Character
{
  private Stat hp;
  private Stat mp;

  public Stat getHp()         {return hp;}
  public void setHp(Stat h)   {this.hp = h;}

  public Stat getMp()         {return mp;}
  public void setMp(Stat m)   {this.mp = m;}
}

// Set the value of current & max HP according to db data.
Stat hp = new Stat();
hp.setCurrent((Integer) userResults.get("hpColumn1"));
hp.setMax((Integer) userResults.get("hpColumn2"));

Character thisCharacter = new Character();
thisCharacter.setHp(hp);
// do the same for mp

另外一个简单的步骤是创建一个
字符
构造函数,该构造函数将采用
hp
mp

这一问题可能会得到更好的解决。对于您当前的实现,有更好的方法吗?codereview?+1这些原则可以被认为是与试图实现具有高内聚性的类相一致的,对吗?是的,争取和。这是大多数软件工程学校都应该教的东西,但在我的脑海中,这几乎是失败的。