如何在面向对象编程方面思考?

时间:2011-02-04 19:46:53

标签: oop

我对游戏编程感兴趣了一段时间,并尝试阅读很多关于OOP的书籍。问题在于,大多数情况下,书籍会向您显示代码并说“在此处添加”“将其添加到那里”,但是他们无法解释OOP的“大局”而不是跳过。我想知道如何用OOP来思考。例如,我已经阅读了这个帖子Object Oriented application problems in game development,它可以让你对如何思考你的课程有一些很好的见解(比如,玩家“有”,“能”......世界“听”)。我想要一些帮助的是一种思考方式,使正确的问题能够很好地规划哪些事情应该留给“玩家类”做,哪些事情要留给“世界级”去做,哪些事情要做“私人”,哪些要离开“公众”​​等我想回答“为什么”而不是“怎么样”我不想要代码,我想要OOP的问题或思维定势变成自然组织代码的方式。

例如,如果我正在处理碰撞检测。我应该留下这个“世界”进行检查吗?我应该留给玩家检查一下吗?我应该问自己哪个问题?

对于“广泛”的问题感到抱歉,但任何事情都会有所帮助。从一本好的“书”到一些提示。

PD:我没有太多的编程经验

致以最诚挚的问候,

6 个答案:

答案 0 :(得分:2)

停止阅读书籍并离开并开始编程。学习Java。用一本书来做,但不要只是通过动作,不要下载代码自己写。一开始你会想知道OOP有什么意义,但是你会遇到更复杂的问题,你会开始欣赏OOP给你的自由。像继承,封装和多态这样的东西现在正适合你。你有点知道他们的意思,但你没有编写足够的程序来使用这些概念。一旦你使用它们并创建了示例概念的类,那么你就开始学习真正的面向对象编程。你不应该专注于制作你的游戏OOP,你应该专注于让OOP适合你的游戏。

故事的道德就是程序。

答案 1 :(得分:1)

我认为学习OOP的关键在于编写代码,但是开始考虑如何模拟现实世界 - 即,汽车对象具有门,轮胎,引擎等属性,而行为可能是启动引擎,改变石油等等......释放你的思想并用一种方法来思考事物,这种方法与你如何使编写代码变得不那么繁琐和复杂有关。有些问题遗传复杂,但OOP可以帮助您解决问题,并以现实世界的方式思考问题。你可以做到......开始尝试......

答案 2 :(得分:0)

我读过早期版本的"面向对象的思维过程"并且发现这本书对理解整个OOP范例非常有帮助。

http://www.amazon.com/Object-Oriented-Thought-Process-3rd/dp/0672330164/

答案 3 :(得分:0)

我认为“激活”面向对象编程概念的最佳方法是将代码视为模块或构建块 - 编写代码以便以这种方式进行模块化,然后您可以在需要时重用它们代码只需根据需要调用它们,而不是一遍又一遍地编写相同的代码。它既是一门学科,也是一门教学科目。记录代码也很有帮助,所以当你以后再回来重用它时 - 你知道它需要什么样的参数,它产生什么样的输出,以及它是如何做你写的那样做的。

答案 4 :(得分:0)

正如你所说,这是一个非常广泛的问题。凭借经验,您将更好地了解何时使用。

虽然很高兴知道“为什么”,但要记住,了解“hows”为你理解“为什么”奠定了良好的基础。

现在,回答你提出的具体问题。将公共视为您将在API中添加的内容。如果你有一个“播放器类”,你希望你的其余代码用它做什么?你想在某种意义上与它进行互动。与“玩家类”交互的界面是什么?那些你的界面应该是“公开的”。

那么应该私有化的东西是什么?例如,如果玩家类的某些属性必须处于有效范围内(假设介于1到100之间)。你如何阻止人们(代码的其他部分)破坏它?你使用私有。这可以防止其他人将值设置为1001.这样,如果它进入了一个糟糕的状态,你就知道它是搞砸了的类,而不是代码的其余部分。

至于设计,请记住设计会发生变化。当您第一次开始使用您的程序时,您可能会决定一个类应该进行碰撞检测。 (也就是说,你的“世界”有一个碰撞探测器)也许刚开始你用碰撞探测器写下你的“世界”。后来你重构了代码,并有一个名为“碰撞探测器”的类。然后你可以决定它去别的地方,但这很容易,因为你可以让另一个物体“有一个”碰撞探测器。

重点是,如果你的代码足够模块化,这将很容易。没有硬规则。您首先使用您想到的设计编写代码。在此过程中,您将找到更好的做事方式。

答案 5 :(得分:0)

编写,编写软件。人们从OOP中获得了太大的交易。它只是实现某些设计原则的方法,例如模块化和低耦合。您可以尝试并查看代码的代码 - 良好的代码,如何使代码具有灵活性和可维护性。那么你将理解导致良好设计的原则,无论是纯功能,程序,OOP还是任何其他范例。