代码之家  ›  专栏  ›  技术社区  ›  Zaz Volodymyr Null

物体背后的逻辑重要吗?

  •  1
  • Zaz Volodymyr Null  · 技术社区  · 14 年前

    在开发基于主机的Python翻拍经典游戏“Snake”的早期阶段时,有人提交了一个补丁,在任意位置产卵。代码定义了 Food

    我认为我们应该删除食物一旦被消费,然后再创造一个。然而,这个人只是将食物移动到一个新的随机位置,一旦它被消费。虽然后者在我看来似乎不合逻辑,但它似乎做了完全相同的事情,甚至可能更有效率。

    我的问题是:是用前一种逻辑更好,还是用后一种逻辑更好,还是我只是一无所获地吹毛求疵?

    这一切始于: https://bugs.launchpad.net/snakes-game/+bug/628180

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jason Williams    14 年前

    两者都是好的-在一定的常识范围内。

    后一种方法将节省重新分配对象的时间,因此以这种方式回收对象将更为有效—在您的特定示例中,收益可能与此无关,除非堆碎片是一个问题(例如,在RAM非常有限的嵌入式应用程序上)。

    所以一般来说,我建议使用“创建一个新对象”的方法(它遵循“最少惊喜”的原则,并且不太可能让其他来处理代码的程序员感到困惑),除非存在性能问题(例如,在手机这样的嵌入式应用程序上,您的资源非常有限,不希望出现碎片堆),在这种情况下,“重用现有对象”可能是一个明智的解决方案。

        2
  •  4
  •   polemon    14 年前

    我相信两种解决方案都是好的。从内存管理的角度来说,将食物重新定位到另一个位置是不容易出错的,但是由于垃圾收集的原因,您不应该太在意这一点。

    我认为,虽然实例化一个新的食物对象更符合逻辑,更接近现实生活中的模型,但重新定位更有效。

        3
  •  1
  •   David    14 年前

    OOP关注的主要问题不是食物是否重新实例化还是重新定位,而是这种行为在对象之外保持透明。游戏引擎应该告诉对象“你被吃掉了”之类的,但是对象内部如何处理这些不应该被游戏引擎知道。如果在内部,对象保持一个“food”的单子,“consume”方法只是用新的值重新生成food对象,那就好了。这些都是“食物”实现的内部部分,只是不应该在那个类之外知道。