当在经典游戏'Snake'的基于控制台的Python翻拍的早期阶段工作时,有人提交了一个补丁,在随机位置产生食物。代码定义了一个Food
类,它运行良好,但它背后的逻辑似乎有点奇怪。
我认为我们应该在食用后删除食物,然后再创建另一种食物。然而,这个人只是在食用后将食物移动到新的随机位置。虽然后者对我来说似乎不合逻辑,但似乎做了同样的事情,甚至可能更有效率。
我的问题是:使用以前的逻辑或者更晚的逻辑是否会更好?或者我只是简单地挑选任何东西?
答案 0 :(得分:4)
我相信两种解决方案都很好。在内存管理方面,将食物重新定位到另一个位置的可能性更小,但由于垃圾收集,你不应该太在意这一点。
我认为,实例化一个新的食物对象更合乎逻辑,更接近现实生活模式,重新定位更有效。
答案 1 :(得分:4)
要么是好的 - 在某些常识范围内。
后一种方法将节省重新分配对象,因此以这种方式回收它将更有效 - 在您的特定示例中增益可能是无关紧要的,除非堆碎片是一个问题(例如在嵌入式应用程序上内存非常有限。)
回收的危险在于物体可能会保留其前一种状态的痕迹,因此可能不会像新物体那样表现 - 在您的情况下逻辑很简单,因此几乎没有危险,但是更复杂的物体,这可能会变得很重要。
所以一般来说我建议“创建一个新的对象”方法(它遵循“最少意外”的原则,并且不太可能混淆其他来代码工作的程序员),除非有性能影响(例如,在一个嵌入式应用程序,如电话资源非常有限而且不需要碎片堆),在这种情况下,“重用现有对象”可能是一个聪明的解决方案。
答案 2 :(得分:1)
就OOP而言,主要问题不在于食物是否重新实例化与重新定位,而是这种行为在对象之外保持透明。游戏引擎应该告诉对象“你已被吃掉”等等,但是游戏引擎不应该知道对象如何在内部处理。如果在内部,对象维持单个“食物”而“消费”方法只是用新值重新形成食物对象,那就没问题。这些都是“食物”实施的内部因素,而且不应该在该课程之外了解。