什么是正确的OO设计,以实现最大的重复使用和效率?

Pir*_*ooz 1 java oop inheritance

假设我有一个Java包(.jar和源代码).以下是我想重用的一些类的定义.

abstract class Tree {
  public abstract Tree[] children();
  public void print();
}

class LabeledTree extends Tree implements Label {
  Label label;
  Tree[] daughterChildren;
  public Tree[] children();
}

class Demo {
  public static void main(String[] args) {
    Parser p = new Parser();
    String[] sent = { "This", "is", "an", "easy", "sentence", "." };
    Tree parse = p.apply(sent);
    parse.print();
  }
}
Run Code Online (Sandbox Code Playgroud)

apply上面的方法返回一个LabeledTree.现在,我想创建我自己的树类型,例如MyTree,它具有以下结构.

class MyTree {
  int value;
  Label label;
  public void myPrint();
}
Run Code Online (Sandbox Code Playgroud)

你在哪里建议我应该把这个类放在继承树中,以便我可以直接从apply方法实例化这个类的对象?您认为我应该如何设计我的系统以最大化软件重用,而不必解析每个树来构建对象MyTree

Uri*_*Uri 5

几条评论:

首先,您的树定义公开了一个重要的细节 - 每个树对象都是一个节点.这创造了一大堆概念单元.在真正的API中,您将拥有一个Tree接口和一个使用Nodes的实现.所有数据成员都将在节点中,除了根节点,它将在您的TreeImpl中.

其次,我非常相信命名是良好和可读代码的关键第一步,并且它通常会影响您的OO设计的质量.树不应该简单地实现标签.你能说:"树是标签"吗?另一方面,如果你有类似的东西:"TreeNode实现HasLabel",它会更清楚 - "你的树节点有一个标签".

第三,您遇到了众所周知的一致性和差异的OOP问题.根据您当前的设计,标记树的根有一个标签,但较低的节点(简称为树)不一定是带标签的树.调试很有趣.泛型可以帮助您解决这个问题,但请务必阅读Effective Java以了解限制泛型类型的工作方式.