涉及公司代码,隐去具体描述
需求是这样的
比如你有一些原料
let originResources = [{
name: 'a',
type: 'js',
duration: 500,
dns: 400,
},{
name: 'b',
type: 'js',
duration: 300
dns: 200
}]
卵后呢,你需要对里面的数据进行一些指标统计分析,比如计算下duration和dns等一堆指标的平均值,求下最大的,求下最小的,最终输出如下
let result = {
avg: {
duration: 400,
dns: 300
},
min:{
name: 'b',
type: 'js',
duration: 300
dns: 200
}
...省略下max等一堆指标
}
我是怎么写的呢?
(函数名字随便写了)
function getMetrics(){
// 省略一些没用大妈
summary[fileType] = {
avg: {},
min: {},
max: {}
}
// 下面是在一堆资源里来遍历reduce应用avg min max的计算方法
}
问题出现了:
- 如此写如果要新增计算指标要动两个地方,一个是summary,一个是下面的具体计算【对扩展没有开放 耦合】
- 如此写用户没有办法去配置自己需要的计算方式只能用你提供的
显然【对扩展没有开放 死】
当时怎么想的?
avg min max就行了 其他的有毛用 😊
改进方式
将计算方法抽象
cosnt metricCalculates = [{
name: 'avg',
calculate: function() {
// 默认提供的计算实现...
}
},{
name: 'min',
calculate: function() {
// 默认提供的计算实现...
}
}...];
// 在下面使用的时候只需要用metricCalculates.reduce来逐一运算资源[type]就好了
😢不要因为一处不太需要就放弃了代码的编写原则