【发布时间】:2010-12-30 01:03:05
【问题描述】:
对于这个问题,我会尽可能直截了当,因为结构化编程背景一定是我完全缺少的东西。
假设我有一个 Player 课程。这个 Player 类做一些事情,比如改变它在游戏世界中的位置。我将此方法称为 warp(),它以一个 Position 类实例作为参数来修改 Player 的内部位置。这在 OO 方面对我来说完全有意义,因为我要求玩家“做”一些事情。
当我除了修改球员位置之外还需要做其他事情时,问题就出现了。例如,假设我需要将该扭曲事件发送给在线游戏中的其他玩家。该代码是否也应该在 Player 的 warp() 方法中?如果不是,那么我会想象在 Server 类中声明某种辅助方法,例如 warpPlayer(player, position)。这样做似乎会减少玩家对自己作为一系列 getter 和 setter 所做的一切,还是我在这里错了?这是完全正常的事情吗?我已经读过无数次了,将所有内容公开为一系列 getter/setter 的类表明抽象非常差(被用作数据结构而不是类)。
当您需要持久化数据并将其保存到文件时,也会出现同样的问题。由于将播放器“保存”到文件与 Player 类处于不同的抽象级别,因此在播放器类中具有 save() 方法是否有意义?如果没有,像 savePlayer(player) 这样在外部声明它意味着 savePlayer 方法需要一种方法来从 Player 类中获取它需要的每条数据,这最终会暴露该类的整个私有实现。
因为 OOP 是当今最常用的设计方法(我猜?),所以我在这些问题上一定缺少一些东西。我已经与同样从事轻量级开发的同行讨论过,他们也遇到了与 OOP 完全相同的问题。也许正是结构化编程背景使我们无法理解 OOP 的全部好处,而不仅仅是提供设置和获取私有数据的方法,以便从一个地方对其进行更改和检索。
在此先感谢您,希望我听起来不会太像个白痴。对于那些真正需要了解这种设计所涉及的语言的人来说,它是服务器端的 Java 和客户端的 ActionScript 3。
【问题讨论】:
-
StackOverflow 不太适合回答这类问题。正如您所观察到的,OO 编程非常成功,因此我建议您通过阅读几本书并编写一些代码来解决您的问题。
-
我读过几本,包括 Code Complete、Clean Code、The Practice of Programming,还有一些我记不得的。如果其中任何一个直接涉及该主题,请告诉我。我已经看了好几遍了,没有看到任何实质性的东西。
-
我读过 CoComp 和 TPOP(非常好)——干净的代码,我不会用马桶刷。但它们都不是真正关于 OO 的。现在找到一个不“获得” OO 优势的人是不寻常的——我自己的 codse 一直都是以 OO 风格编写的(我已经这样做了 30 年了)所以我可能不是正确的有人要求推荐书,但我一直很喜欢 Grady Booch 的东西。
-
好吧,我还阅读了 Java 的面向对象编程,因此我了解 OO 实践背后的所有术语,甚至阅读了傻瓜设计模式。我明白了所有这些,但没有一个能解决我认为 OOP 的核心问题。