BandMan home

数据驱动

方法:将你的核心逻辑写成数据的形式,并存储在一些通用的文件格式里。

数据、逻辑和函数 - 区别

数据和函数之间的界限不是很明显,因为传递函数指针和传递其他数据一样简单。 像C++、VB、其他面向对象语言,都是建立在VTABLEs的基础上的,虚表基本上维护了函数指针。

这里或许你们会有些疑问,看起来只是写代码的顺序不一样而已,甚至写代码的顺序都是一样的,那事件驱动和数据驱动的区别在哪?一个很有用的区别在于,从事件驱动转换到数据驱动思维后,我们在编程实现的过程中,更多的是思考数据状态的维护和处理,而无需过于考虑 UI 的变化和事件的监听,即使我们页面全部重构了,影响到的只有模板中绑定的部分,重新绑定一下就可以了。

使用数据驱动来写代码会强迫开发者有一个前置条件,你会需要去设计一个数据结构,或者也可以称之为一个模型。在代码开发前的数据设计会有什么好处呢?

/**Data-Driven **/
function returntax($usstate, $price){
	$result = 0;
	$aryStateTax = array('MA'=>0.05, 'NJ'=>0.07, ...); 
	if (array_key_exists(strtoupper($usstate), $aryStateTax)) {
		$result =  $aryStateTax[strtoupper($usstate)]*$price;
	}
	return $result;	
}
/**Table-Driven - if we want to put the power of logic in hands of users who can edit the state table**/

事件流与数据流

使用数据驱动还有一个好处,就是基于模型设计的代码,即使经历了需求变更、页面结构调整、后台接口调整,也可以快速地实现更新和支持。还是以上面的表单作为例子,我们在基于事件驱动开发,通常的思考和写代码的方式是:

也就是说,事件驱动的特点是,以某个交互操作为起点,流程式地处理逻辑。流程式的代码,在遇到中间某个环节变更,就需要同时更新该变更点前后环节的流程交接。例如我们在页面加载的时候,需要先加载本地缓存,再从后台请求更新。如果是上面的流程,我们需要新增“本地获取缓存”的环节,同时需要在“页面加载时”、“更新到页面”两个环节进行衔接。

而数据驱动的思考方式特点是,以数据为中心,思考数据的输入和输出:

同样的,如果我们需新增“本地获取缓存”的环节,在数据驱动的情况下,只是增加了一个数据来源,对于整个模型影响会小很多:

其实在我们日常开发中,更多时候是结合了事件驱动和数据驱动来使用。而如果现在的你刚入门没多久,也不用纠结是否真的用了某种思维模式、是否用了什么设计模式,我们在一次次的开发过程中,会不断地积累和加深一些思考,适合自己的才是最好的。

Reference: https://sirice.netlify.app/posts/2020/08/18/event_driven_and_data_driven/

基于数据驱动的游戏对象系统(GDC2002)

Fork me on GitHub