方法:将你的核心逻辑写成数据的形式,并存储在一些通用的文件格式里。
数据和函数之间的界限不是很明显,因为传递函数指针和传递其他数据一样简单。 像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/