如何在面向对象的编程中应用面向数据的设计?[关闭]


17

我已经阅读了很多有关面向数据的设计(DOD)的文章,并且我理解它,但是我不能在设计时就牢记DOD的面向对象的编程(OOP)系统,我认为我对OOP的教育正在阻碍我。我应该如何融合两者?目的是在幕后使用DOD时拥有一个良好的OOP界面。

我也看到了这一点,但并没有太大帮助:https : //stackoverflow.com/questions/3872354/how-to-apply-dop-and-keep-a-nice-user-interface


3
您需要发布一些更具体的(与游戏相关的),这个问题过于笼统。
DeadMG

您是对的,但是除了游戏编程之外,我还没有看到其他领域对此进行讨论。
Pombal

4
@DeadMG:我从未见过在游戏开发之外使用术语“面向数据的设计”,除非是指源自游戏开发的实践。如果您正在考虑数据驱动的设计,那不是同一回事。

Answers:


16

我会这样说 Noel Llopis的博客可能是结合面向对象的编程和面向数据的设计的最佳说明。他是DOD术语的发起人之一,是一名强大的C ++程序员,并且就其风格以及如何利用C ++的OO功能撰写了大量文章。

根据Noel的说法,我想我是否应该说出将它们组合的关键要素:

  • 尽可能使用POD和非成员,非朋友功能。 非成员,非友元函数可改善封装,并且是数据定向的关键部分,因为它们保留数据即数据。
  • 避免在您的对象上存储“临时”状态。临时状态会阻塞您的数据。如果您需要缓存某些东西(例如,为了提高性能),那么它属于一个新类,通过非成员非朋友函数链接这两种类型,而不是is-a或has-a关系。
  • 避免使用处于状态A或状态B的对象。最好在两个对象之间切换,其中一个是A,另一个是B。
  • 避免多态,避免虚函数,避免模板,避免使数据具有相同而不是实际相同的语法外观的任何内容。

国防部宣传中的另一个大人物是Insomniac的Mike Acton,但是阅读他写的书后,我会说他并不是真正的面向对象(或面向对象,只要它仍然是面向数据的)。


谢谢您的回答,但您要说的是使用DOD应该怎么做,而不是如何使用OO。我已经读过Noel的博客,Mike Acton的言论(:D),DICE的出版物,而且我了解如何使用DOD,但不能混入
OO。– Pombal

2
您认为OO是什么?我将Noel的大多数代码称为OO,例如-仍然存在类和实例,仍然存在基于类型的调度,可能仍然存在继承(C ++ 0x对POD的定义已更改为允许这样做)。仍然有人从数据而不是操作开始对问题进行建模。

例如,多态性是OOP的重要组成部分,就像对象的状态一样。面向数据的设计应该使用继承来赋予游戏实体诸如动画能力,交互能力,移动能力……的属性。一切都取决于一个聪明的数据管理器,该管理器仅向每个组件提供所需的实体,例如物理或动画。
danijar

@sharethis:如果我理解您的反对意见,那就是子类型多态性是OO的关键功能。我同意一种自称为OO而不支持它的语言会很奇怪,但这并不意味着它是人们遇到编程游戏遇到的那种问题的首选工具,即使该游戏是以OO风格进行编程的。我还要指出,DOD实际上是在避免特定种类的多态性(标称子类型化),而在鼓励其他种类(在C ++中,使用ADL的即席多态性,或通过保证值表示形式的结构性多态性)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.