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

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

需求是这样的

比如你有一些原料

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,177评论 2 89
  • 有些事,你看懂了并非看清了;看清了并非看穿了,看穿了并非看开了。
    6310阅读 1,040评论 0 0
  • 管理概念1:画饼 老板们都喜欢给员工画饼充饥,规划蓝图,引爆工作激情的同时也在安抚焦虑的情绪。他们指着一张地图对身...
    凉凉小茶馆阅读 6,763评论 0 4
  • 洋葱岛冒险的第二关是“章鱼哥:碎片阅读”。 碎片阅读不是什么都学,而是带着目的和兴趣从一堆东西中找到想...
    米斯特李Flynn阅读 3,401评论 0 0

友情链接更多精彩内容