在用户交互方面,OO vs Simplicity

sea*_*owg 9 java oop

作为一个夏季的项目,我从Uni有一些停机时间,我打算建立一个垄断游戏.然而,这个问题更多的是关于问题的一般概念,而不是我正在尝试执行的具体任务.

我决定采用自下而上的方法构建它,创建围绕四十个空间板的运动,然后继续与空间交互.我意识到我完全不确定如何处理这个问题,而且我在两个设计思想之间徘徊:

  1. 为每个空间提供自己的对象,空间对象的所有子类,以便空间对象本身可以定义交互.我可以通过为每种类型的空间实现不同的land()方法来实现这一点.

  2. 只给出属性和实用程序(因为每个属性都有独特的功能)对象,并创建方法来处理程序主类(或我称之为Board)中的购买/租赁等.像go和super tax这样的空间可以通过一小组条件来实现,以检查玩家是否在特殊空间.

选项1显然是OO(我觉得是正确的)做事方式,但我只想处理来自程序主类的用户交互.换句话说,我不希望空间物体与玩家交互.为什么?Errr.到目前为止,我所做的很多编码都具有这种简单性,但我不确定这对于大型项目是否是一个梦想.我真的应该在一个完全独立的类中处理用户交互吗?

你可以看到我对这种情况很困惑.这有什么办法吗?并且,有没有人对实际的OO设计有任何建议可以帮助一般?

编辑:请注意,我觉得我对这个问题失去了一点关注.我对组合OO和任何外部操作(命令行,网络,GUI,文件管理等)的一般方法感兴趣.

Oak*_*Oak 5

我同意选项#1似乎更好.

至于"用户互动" - 一切都取决于.您可以将一些代码留在另一个类中.例如,

// in main class
user.landOn(space);
if (space.containsProperties()) doSomething(); // Option #1 for some user-interaction code

// in User.java
public void landOn(Space s) {
    // do some checks
    s.land(this);
    if (s.containsProperties()) {...} // Option #2
    // something else?
}

// in GetMoneySpace.java
@Override
public void land(User u) {
    u.awardCash(200);
    // Option #3 - no properties so nothing here
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这比OOP-y(在我看来更好)

if (space.isCashAwardSpace()) {
    user.awardCash(space.getAward());
}
if (user.something()) doSomething(); // Some user-interaction code
Run Code Online (Sandbox Code Playgroud)


drh*_*ris 5

最后,这取决于你.这是OO的美丽,因为它需要解释.通常应该遵循一些模式,但一般来说,您决定如何处理它.

但是,您应该仔细考虑系统中每个参与者应该知道的其余部分.财产应该真正了解玩家,他的账户余额以及其他玩家吗?可能不是.物业应该知道它的成本,租金是多少等.

另一方面,主要播放线程是否应关注支付租金等微不足道的事情?可能不是.它的主要关注点应该是游戏本身的状态,例如骰子滚动,每个玩家是想交易还是购买还是非抵押/抵押,这样的事情.

想一想有关降落在广场上的动作.登陆后,玩家有3种选择:

  • 购买房产
  • 忽略该财产
  • 付房租

现在,系统中的哪个actor知道完成该操作所需的所有信息.我们有Game类,它不关心这种单调乏味.我们拥有该物业,并不真正关心球员.但是Player对象知道所有这些信息.它记录每个玩家拥有的内容,并可以轻松访问正确的数据.

所以,如果是我,我会制作一个Player.performMove(Die d)方法.它可以轻松访问帐户.这也允许类之间的耦合最少.

但最终,这取决于你.我相信人们已经用完美的OO以及功能或程序语言创建了Monopoly克隆.最后,使用您所知道的并继续重构,直到您对最终设计感到满意为止.