理解数据驱动编程

以前在学校的时候就听同学说过数据驱动编程。最近在看《UNIX编程艺术》时读到了关于这个概念的详细描述,发现当时我把数据驱动编程地把数据驱动编程和面向对象(OO)搞混淆了。 首先就来说说它们两者之间的区别。

数据驱动编程与面向对象(OO)的区别

简单来说数据驱动编程就是:程序的逻辑并不是通过硬编码实现的而是由数据和数据结构来决定的,从而在需要改变的程序逻辑的时候只需要改变数据和数据结构而不是代码。这样做的目的就是为了提高程序的灵活性。这和 UNIX 哲学之一「提供机制,而不是策略」是相吻合的,因为策略经常改变,而机制相对固定,在数据驱动编程中我们就可以使用数据来应对「策略」的变化,而使用数据驱动编程实现的程序就可以看做是我们所提供的「机制」。

它和面向对象的区别是:

  1. 在数据驱动编程中数据不仅仅是对象的抽象,更重要的是它还可以去定义程序的控制流。
  2. 面向对象考虑的是封装性,而数据驱动编程考虑的尽可能的少编写固定代码。

数据驱动编程的应用

数据驱动编程是一种编程思想,应用场景很多,在这里列举出我比较熟悉几种:

  1. 状态机的实现。状态机中不同状态的逻辑和转换可以直接编写在代码中,但是也可以通过数据结构和数据来实现。比如通过配置文件来配置状态机的逻辑以及转换条件,事实上很多游戏引擎就是通过这样的方式实现了状态机的可视化编辑。

  2. 在有的面向对象语言中可以根据数据结构通过元类修改(mateclass hacking)的方式动态的生成类,来提高程序的灵活性。

  3. 使用行为树的实现的游戏 AI。