考虑到我的结构化编程背景,我会尽可能直接地谈论这个问题。比如说我有一个Player类,它可以在游戏世界中改变自己的位置。我调用了warp()方法,并将一个Position类实例作为参数传入,以修改Player的内部位置。从面向对象的角度来看,这对我来说是完全合理的,因为我要求玩家“去执行”某些操作。
问题出现在我需要除了修改玩家位置之外做其他事情时。例如,假设我需要向在线游戏中的其他玩家发送warp事件。那么这段代码是否也应该包含在Player的warp()方法中呢?如果不是,那么我想象一下,在Server类中声明某种次要方法,例如warpPlayer(player, position)。这样做似乎将玩家所做的一切都简化为一系列获取器和设置器,或者我错了吗?这种情况是完全正常的吗?我已经无数次阅读过,将所有内容都公开为一系列getter / setter表示抽象性很差(被用作数据结构而不是类)。
当你需要将数据持久化,将其保存到文件时,同样的问题也会出现。由于将玩家“保存”到文件的抽象级别与Player类不同,所以在Player类中定义save()方法是否合理呢?如果不是,那么在外部声明savePlayer(player)就意味着savePlayer方法需要一种方式从Player类中获取它所需的每个数据,这最终会公开该类的整个私有实现。
因为面向对象编程是当今最常用的设计方法(我想?),所以在这些问题上肯定有些我没有理解到的东西。我已经与我那些轻度开发的同事讨论过这个问题,他们也遇到了与面向对象编程相同的问题。也许只是我们结构化编程背景使我们无法理解OOP的全部好处,将其视为提供方法以设置和获取私有数据,以便从一个地方更改和检索数据。
提前感谢并希望我听起来不太像个白痴。需要了解这个设计所涉及的语言的人,服务器端是Java,客户端是ActionScript 3。