为随机客户选择合适的类名

时间:2013-07-24 09:11:04

标签: java class oop inheritance

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

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

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

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

我不确定这个类会被调用,也许是类似于RandomGenerator或RandomPicker的东西。任何建议都会受到欢迎。

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

2 个答案:

答案 0 :(得分:2)

想象一下,你是一个从未见过你的代码的人,他们必须了解它并修复bug。你能给出的最清晰的名字是什么,它将表达它的作用,并暗示它是硬币和死亡的父类?

我建议在这种情况下避免使用类似动词的名字,因为你对骰子或硬币做了一些事情来产生一个数字 - 一枚硬币不会主动产生数字;你必须做些什么来得到一个数字。所以任何以-er结尾的东西,至少对我而言都不会暗示“硬币或死亡的父类”。

Tossable? RandomValued?

答案 1 :(得分:0)

您的班级设计无效。

在行为意义上,硬币和骰子是平等的,但扔掉它们的东西却不是。因此,你不能在这里申请继承。这些课程应该代表我们世界的抽象。您应该尝试通过其属性而不是外观来分解对象。硬币和骰子肯定看起来不同,但行为方式相同。

如果你仔细看看。当你确定一个叫做Die的常见东西时,我会提供一点点,这是一个建立在Faces上的结构,可以为你提供信息。但这取决于你如何得到这个结果,其中一种方法是抛弃死亡。投掷过程在逻辑上等于选择模具的随机面。因此,最后您可以调用以两种方式获得结果的过程。 getRandomFacethrowFace。 ThrowFace对人类来说更直观,但编码器可能会误导,特别是在Java中,throw是一个关键词。

你需要的第一堂课是代表骰子面孔的课程。

public final class Face {

   private  String displayName;

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

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

}

因为骰子不仅仅是Faces列表

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并实现随机逻辑。