Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在用户交互方面,面向对象vs简单性_Java_Oop - Fatal编程技术网

Java 在用户交互方面,面向对象vs简单性

Java 在用户交互方面,面向对象vs简单性,java,oop,Java,Oop,作为一个夏天的项目,当我在大学休息的时候,我打算制作一个垄断游戏。然而,这个问题更多的是关于问题的总体思路,而不是我试图执行的具体任务 我决定用一种自下而上的方法来构建它,只需在一块40空间的板上创建运动,然后继续与空间进行交互。我意识到我很不确定进行这项工作的最佳方式,我在两个设计理念之间左右为难: 给每个空间赋予它自己的对象,一个空间对象的所有子类,这样交互就可以由空间对象本身定义。我可以为每种类型的空间实现不同的land()方法 只提供属性和实用程序(因为每个属性都有独特的功能)对象,并在

作为一个夏天的项目,当我在大学休息的时候,我打算制作一个垄断游戏。然而,这个问题更多的是关于问题的总体思路,而不是我试图执行的具体任务

我决定用一种自下而上的方法来构建它,只需在一块40空间的板上创建运动,然后继续与空间进行交互。我意识到我很不确定进行这项工作的最佳方式,我在两个设计理念之间左右为难:

  • 给每个空间赋予它自己的对象,一个空间对象的所有子类,这样交互就可以由空间对象本身定义。我可以为每种类型的空间实现不同的land()方法

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

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

    正如你所看到的,我对这种情况很困惑。这有什么办法吗?还有,有没有人对实际的OO设计有什么建议可以帮助我们


    编辑:我想指出的是,我觉得我对这个问题失去了一点关注。我对将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种选择:

        • 买房
        • 忽略属性
        • 付房租
        现在,系统中的哪个参与者知道完成该任务所需的所有信息。我们有游戏课,它不关心这样的单调乏味。我们有财产,它并不真正关心球员。但是Player对象知道所有这些信息。它记录了每个玩家拥有的东西,并且可以轻松访问适当的数据

        所以,如果是我,我会成为一名球员。performMove(Die d)方法。它可以方便地访问帐户。这还允许类之间的耦合最少


        但最终,这取决于你。我相信人们已经用完美的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
        }