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

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

作者: 懒先森 | 来源:发表于2018-09-17 18:48 被阅读40次

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

    需求是这样的

    比如你有一些原料

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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/cqarnftx.html