我不清楚术语是什么,我想表达的是 某个数据或者属性值是通过其它的数据配合一些算法而得到的。
比如 fullName = firstName + " " + lastName;
fullName 的值取决于另外2个属性值和一个算法。 (我称这个情况较数据依赖)
我们做开发时经常都会遇到这样的情况,比如在做数据库时,为了性能优化,我们很可能会设计一些冗余数据,这些冗余数据都是依赖其它column值配合一些算法的来的。
在前端也有这样的情况,比如购物车的总价钱就是通过产品和数量算出来的。
我们处理通常有3种方式
第一种:
属性访问器 getter
就是写一个 getter 函数,每次要获取fullName时,就先运行函数去获取firstName,lastName然后组合。
这做法比较简单明了。大部分情况我们都会用这个。
缺点就是如果依赖的值很多,或者算法很复杂,调用平率高的话,对性能消耗不太理想。(比如数据库,每次获取时,你可能要从好多个表获取依赖值,然后做统计等等 , 又或者在前端view同步,你可能要做一个类似脏数据更新,确保依赖值改变后,getter必须触发)
第二种:
触发器局部更新。
这回我们不等到需要数据时才去获取依赖,而反过来当依赖改变的时候去更新数据。
比如当购物车某个价值100块的产品被移除时,总数就 - 100 这样。
触发器的概念对性能就比较好了。
缺点就是代码有点凌散,而且我们也不一定每次都可以通过改变的依赖值推算出改变数据的算法 ( 比如上面的 -100 块, 是比较简单的 )
第三种:
综合 (KO js 用的就是这个)
这方式是写一个getter
然后在所有依赖值写触发器。每当依赖值改变,就调用getter去所有的依赖值重新获取一篇。
这样代码就不凌散了,性能也还可以。
以上的方法没有最好,只有比较适合的。
我个人使用angularjs 开发,所以前端我都是用第一种方法。
数据库的话,一般上使用第2种。写一个简单的 trigger. (因为我不会写储蓄过程)
更新 2016-01-28
依赖跟踪的衡量
3种实现:
1.每次 get 重新算 ( 情况 : 少get多set, 重新算的速度能接受)
2.每一次 set 的时候重算 (情况 : 少set多get , 重新算的速度能接受)
3.每一次 set 做微调整 (情况 : 少set多get , 重新算的速度不能接受)
好理解 :
1.最好理解, 1个method,1个调用
2.第2好理解,1个method,多个调用(没个set多要调用)
3.最难理解, 多个method,多个调用