0

如果我把它放在错误的地方,我首先道歉。但我相信这是一个固有的编程设计决定,因此它在这里。

我正在开发一个 android 游戏,它具有通过继承相关的各种类。

我有一个 Coin 对象和一个 Die 对象(就像在单个 Dice 中一样),Die 对象有另一个子类 CustomDie(它允许用户定义一个具有许多面的骰子,即 7 面骰子)。

由于硬币和骰子具有非常相似的功能,硬币会在 1 和 2 之间选择一个随机数,骰子会在 1 和 6 之间执行,而自定义骰子会在 (n,m) 或用户定义的任何范围之间执行此操作. 我正在考虑将一些功能放在父类中。

我不确定该类会被称为什么,可能类似于 RandomGenerator 或 RandomPicker。任何建议都会受到欢迎。

我同意大多数答案将基于意见,但需要一定程度的知识,即动词/名词的使用;选择一个好的班级名称。这将在以后影响项目中使用的方法名称和其他类/变量的选择。优秀的软件架构师会集中在一两个最好的建议上,所以请不要把这个问题写成无法回答的问题。

4

2 回答 2

2

想象一下,你是一个以前从未见过你的代码的人,他们必须理解它并修复一个错误。您可以给它起的最清晰的名称是什么,它将表达它的作用并暗示它是 Coin and Die 的父类?

在这种情况下,我建议避免使用类似动词的名称,因为您对骰子或硬币做某事以产生数字 - 硬币不会主动产生数字;你必须对它做点什么才能得到一个数字。所以任何以 -er 结尾的东西,至少对我来说,并不意味着“硬币的父类或死亡”。

可扔的?随机值?

于 2013-07-24T09:25:42.887 回答
0

您的课程设计无效。

在行为意义上,硬币和骰子是平等的,但投掷它们的东西却不是。因此,您不能在此处应用继承。这些类应该代表我们世界的抽象。您应该尝试通过其属性而不是外观来分解对象。硬币和骰子确实看起来不同,但行为方式相同。

如果你仔细看看。当您确定称为 Die 的常见事物是建立在为您带来信息的 Faces 之上的结构时,我将指出这一点。但这取决于您如何获得此结果,其中一种方法是掷骰子。投掷过程在逻辑上等同于选择骰子的随机面。因此,最后您可以通过两种方式调用将获得结果的过程。getRandomFacethrowFace。ThrowFace 对人类来说更直观,但对于编码器来说可能会产生误导,尤其是在 throw 是关键字的 Java 中。

您需要的第一个类是代表骰子面的类。

public final class Face {

   private  String displayName;

   Face(String displayName) {
       this.displayName = displayName;
   }

   public String getDisplayName() {
      return this.displayName;
   }

}

因为骰子只不过是一张面孔列表

public final class Die {

  private Face[] faces;

  public Die(Face[] faces) {
    if(faces == null) throw new IllegalArgumentException("Faces must not be null"); 
    if(faces.length < 2) throw new IllegalArgumentException("Die must have at least two faces");
    this.faces = faces;
  }

  public Face getFace(int face) {
     return this.faces[face];
  }

  public int getFaceCount() {
     return this.faces.length;
  }
}

最后,我们需要一些可以掷骰子的东西来得到脸。我们可以创建一个带有静态方法的 utill 类来支持对 Dice 的不同操作。

public final class DieUtill {

   public static final Die COIN   = new Die(new Face[] {new Face("head"),new Face("tail")});
   public static final Die DICE   = new Die(new Face[] {new Face("1"),new Face("2"),new Face("3"),new Face("4"),new Face("5"),new Face("5")});

   public static final Face getRandomFace(Die die) {

     int face = new Random().nextInt(die.getFaceCount());

     return die.getFace(face);

   }

}

如果我们需要关于随机值更复杂的逻辑,你应该创建一个像 FaceRandomizer 这样的类,然后在构造函数中传递一个 Dice 并实现随机逻辑。

于 2013-07-24T09:51:19.270 回答