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
Oop 对象背后的逻辑重要吗?_Oop_Logic - Fatal编程技术网

Oop 对象背后的逻辑重要吗?

Oop 对象背后的逻辑重要吗?,oop,logic,Oop,Logic,在基于控制台的Python翻拍经典游戏“蛇”的早期阶段,有人提交了一个补丁,在任意位置产卵食物。代码定义了一个Food类,该类运行良好,但其背后的逻辑似乎有点奇怪 我认为我们应该在食物被消费后删除它,然后再创建一个。然而,这个人只是简单地移动食物到一个新的随机位置,一旦它被消费。虽然后者在我看来似乎不合逻辑,但它似乎做了完全相同的事情,甚至可能更有效 我的问题是:是使用前一种逻辑更好,还是使用后一种逻辑更好,还是我只是对什么都不挑剔 这一切都始于:我相信这两种解决方案都很好。从内存管理的角度来说

在基于控制台的Python翻拍经典游戏“蛇”的早期阶段,有人提交了一个补丁,在任意位置产卵食物。代码定义了一个
Food
类,该类运行良好,但其背后的逻辑似乎有点奇怪

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

我的问题是:是使用前一种逻辑更好,还是使用后一种逻辑更好,还是我只是对什么都不挑剔


这一切都始于:

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


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

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


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

两者都可以——在一定的常识范围内

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

循环使用的危险在于,对象可能会保留其以前状态的一些痕迹,因此可能不会以与新对象相同的方式进行操作-在您的情况下,逻辑很简单,因此没有什么危险,但对于更复杂的对象,这可能变得非常重要


因此,一般来说,我建议使用“创建一个新对象”的方法(它遵循“最少意外”的原则,并且不太可能混淆其他编写代码的程序员),除非有性能方面的影响(例如,在嵌入式应用程序(如手机)上,您的资源非常有限,不需要碎片化的堆),在这种情况下,“重用现有对象”可能是一个明智的解决方案。

在某些常识范围内,两者都可以

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

循环使用的危险在于,对象可能会保留其以前状态的一些痕迹,因此可能不会以与新对象相同的方式进行操作-在您的情况下,逻辑很简单,因此没有什么危险,但对于更复杂的对象,这可能变得非常重要


因此,一般来说,我建议使用“创建一个新对象”的方法(它遵循“最少意外”的原则,并且不太可能混淆其他编写代码的程序员),除非有性能方面的影响(例如,在嵌入式应用程序(如手机)上,您的资源非常有限,不需要碎片堆),在这种情况下,“重用现有对象”可能是一个聪明的解决方案。

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

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

+1对于基本的面向对象逻辑有很好的解释,但是其他一些答案对我的特定问题更深入。+1对于基本的面向对象逻辑有很好的解释,但是其他一些答案对我的特定问题更深入。非常感谢深入解释。完美地回答了我的问题。谢谢,非常深入的解释。完美地回答了我的问题。+1:很好的简明解释,但Jason的回答更详细地说明了解决方案的实际含义。+1:很好的简明解释,但Jason的回答更详细地说明了解决方案的实际含义解决。