【菜农大丰收】论我写的一处违反开闭原则的代码

涉及公司代码,隐去具体描述

需求是这样的

比如你有一些原料

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]就好了

不要因为一处不太需要就放弃了代码的编写原则

你可能感兴趣的:(【菜农大丰收】论我写的一处违反开闭原则的代码)