As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




编辑:我真的很感谢大家的投入。我从所有回复中都得到了一些收获,并且对OOD有了很多了解。

我正在制作一个简单的虚拟桌面 war 游戏。为了表示战场上的单位,我具有以下简单的类层次结构:一个抽象类单元,以及两个派生类Troop和Vehicle。

我还有另一个类,该类具有游戏中所有单元的哈希表。哈希表的值是Unit类型的,因此我可以在O(1)时间内引用它们。

在大多数情况下,这很好,但是有时调用者需要知道某个东西是部队还是车辆,以便从这些派生类中调用特定方法。为了适应这一点,我创建了两个将强制执行类型的get方法:
  public Troop getTroop(String uniqueID) {
    Unit potentialTroop = get(uniqueID);
    if(potentialTroop instanceof Vehicle) {
      throw new InternalError();
    }
    return (Troop) potentialTroop;
  }

  public Vehicle getVehicle(String uniqueID) {
    Unit potentialVehicle = get(uniqueID);
    if(potentialVehicle instanceof Troop) {
      throw new InternalError();
    }
    return (Vehicle) potentialVehicle;
  }

(请注意,它所属的类仅扩展了Hashtable,因此此处使用的get方法是Java的hashtable的get方法。)

因此,我认为这是糟糕的OOD设计,因为如果我进一步扩展单位,我将不得不向该哈希表添加更多的检查和更多的#get方法。

我这样说对吗?如果是这种情况,有人对OOD有其他建议吗?

最佳答案

这是执行此操作的简单方法,不一定是最好的方法,但它满足以下要求:

  • 能够从Unit集合
  • 中动态获取特殊类型
  • 以后可以添加其他Unit类型,而不必添加一堆处理程序方法。

  • 该解决方案使用"template"类执行匹配:
    @SuppressWarnings("unchecked")
    public <T extends Unit> T getSpecializedUnitType(Class<T> unitTypeClass, String uniqueID) {
        Unit potentialTroop = units.get(uniqueID);
        if(potentialTroop == null) return null;
    
        return potentialTroop.getClass().equals(unitTypeClass) ?
            (T) potentialTroop : null;
    }
    

    我假设您将要更正您的代码,而不是从Map扩展而来对其进行封装。

    关于Java-我的代码显然违反了常见的OOD范例,但不确定如何改进它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14916524/

    10-10 10:19