Java 在用户交互方面,面向对象vs简单性
作为一个夏天的项目,当我在大学休息的时候,我打算制作一个垄断游戏。然而,这个问题更多的是关于问题的总体思路,而不是我试图执行的具体任务 我决定用一种自下而上的方法来构建它,只需在一块40空间的板上创建运动,然后继续与空间进行交互。我意识到我很不确定进行这项工作的最佳方式,我在两个设计理念之间左右为难:Java 在用户交互方面,面向对象vs简单性,java,oop,Java,Oop,作为一个夏天的项目,当我在大学休息的时候,我打算制作一个垄断游戏。然而,这个问题更多的是关于问题的总体思路,而不是我试图执行的具体任务 我决定用一种自下而上的方法来构建它,只需在一块40空间的板上创建运动,然后继续与空间进行交互。我意识到我很不确定进行这项工作的最佳方式,我在两个设计理念之间左右为难: 给每个空间赋予它自己的对象,一个空间对象的所有子类,这样交互就可以由空间对象本身定义。我可以为每种类型的空间实现不同的land()方法 只提供属性和实用程序(因为每个属性都有独特的功能)对象,并在
编辑:我想指出的是,我觉得我对这个问题失去了一点关注。我对将OO与任何外部操作(命令行、网络、GUI、文件管理等)相结合的一般方法非常感兴趣。采用第一种设计。您将拥有一个属性类,并对特殊属性进行子类化,覆盖默认行为 就交互而言,您可以拥有一个令牌类,并在电路板上移动该类的实例。您必须给用户一些选项,但是是的,从响应中,您应该调用对象上的方法,而不是在用户事件中放入复杂的逻辑 示例类:
- 财产
- 名字
- 价格
- 基本租金
- 户数
- 伯爵酒店
- 抵押
- getCurrentRent()
- 铁路延伸财产
- 实用程序扩展属性
- 董事会
- 性质
- 使用者
- 代币
- 玩家名称
- 当前属性
- 自有财产
- 购买物业()
- payRentOnProperty()
- 抵押财产()
- 移动()
- 我同意选项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
}
这比类似的东西更糟糕(在我看来更好)
if (space.isCashAwardSpace()) {
user.awardCash(space.getAward());
}
if (user.something()) doSomething(); // Some user-interaction code
最后,这取决于你。这就是OO的美,因为它可以被解释。有一些模式通常应该遵守,但一般来说,这是你的决定如何处理它 <>但是,你应该仔细考虑系统中的每一个演员应该知道它的其余部分。财产真的应该了解玩家、他的帐户余额和其他玩家吗?可能不会。房产应该知道它的价格、租金等 另一方面,主打线程是否应该关注诸如支付租金之类的琐事?可能不会。它的主要关注点应该是游戏本身的状态,比如掷骰子,每个玩家是否想要交易或购买,或是取消抵押/抵押,诸如此类的事情 想一想降落在广场上的动作。登陆后,玩家有3种选择:
- 买房
- 忽略属性
- 付房租
但最终,这取决于你。我相信人们已经用完美的OO以及函数或过程语言创建了垄断克隆。最后,使用你所知道的,继续重构,直到你对最终设计满意。我不完全确定我是否理解正确。在设计软件时,您总是有这样的选择。我个人会选择第一选择。一个论点是我个人对小游戏(拼字游戏)的体验,这向我证明了好的设计对小项目也很重要。OOP的要点是,您可以对自己的设计进行不同的思考,从而获得一些设计优势。例如,想象一下添加新字段、更改现有字段、在多个字段中重用一个字段的行为有多困难。您的第一种方法就是我喜欢的方法。它封装了需要的行为。因此,您将拥有实用程序、属性、GotoJail和FreeParking的空间子类-基本上是所有不同的空间类别。什么是一个类别是它的共同行为 属性空间本身可能有一个组对象作为成员,例如,将所有深蓝色属性组合在一起 至于与用户的交互,您将一个Board(或者更好的是GameController)实例传递到每个空间,这样它就知道它是哪个游戏的一部分,并且可以影响gam
public void move(Player p, int spaces){
Space landingSpace = board.getLandingSpace(p,spaces);
landingSpace.land(p); //apply your logic here
}