改动前的代码,问题如下

  • if语句滥用
  • 重复功能代码
  • 数据、ui和业务逻辑代码耦合
  • 不易测试
function errorCatch(err) {if (err.status == 0) {wx.showToast({title: '网络开小差了,请重试',icon: 'none',duration: 2000})} else if (err.status == 1) {wx.showToast({title: '接口请求超时,请重试',icon: 'none',duration: 2000})} else {if (err.response.data.message) {wx.showToast({title: err.response.data.message,icon: 'none',duration: 2000})} else {wx.showToast({title: '请求数据失败,请稍后再试',icon: 'none',duration: 2000})}}
}

方案一,代码变清晰了,也更精简,但是仍有问题

  • 数据和业务逻辑依然耦合
  • 代码可读性,_.get(err,“response.data.message”) 这是干嘛的?
  • 扩展性问题,如果再要增加一条 default 情形的逻辑就比较困难了
  • 依然有重复的代码,比如多次调用showError
function showError(text){console.log(text);// show pop...
}
function catchError(err) {switch(err.status){case 0: showError("网络开小差了,请重试");break;case 1: showError("接口请求超时,请重试");break;default:showError(_.get(err,"response.data.message") || "请求数据失败,请稍后再试");break;}
}

方案二,数据分离,剥离并封装影响阅读的代码,同时增加注释。但这还不够

  • getTextAndShow 函数承载了 get text 和 show text 两大功能,这是没有必要的,也不利于单元测试
  • 如果要新增逻辑,很可能就要改动 getTextAndShow 这个核心函数
  • 假如 getTextAndShow 这个函数功能复杂,同时又是新人来修改,就很容易出问题了
  • 代码封装性依然较差,难以复用
var info = {"0":"网络开小差了,请重试","1":"接口请求超时,请重试","error":"请求数据失败,请稍后再试",
}
function showError(text){console.log(text);// show pop...
}
//使用了lodash 库中的get方法来查找嵌套对象属性
function existProperty(obj,property){return _.get(obj,property);
}
function getTextAndShow(info,err){var text = info[err.status];if(!text && existProperty(err,"response.data.message")){text = err.response.data.message;};showError(text || info["error"]);
}

最终方案

  • 将 get text 和 show text 进行了分离
  • 实现了数据、ui功能和业务逻辑分离
  • 实现了可测试。实际上只需要测试业务代码,即 set 函数即可
  • 实现了链式调用,代码可读性提高,只看调用就知道做了什么事情,有必要才会去关注内部细节
  • 完全实现了复用性。如果有必要,可以改造为构造函数版本,重写set方法,就可以支持更多业务逻辑
  • 实现了可扩展性。如果一个新人,需要增加一条 get text 的逻辑,他可以不必去改动 set 方法的实现,而是新增一个 newSet 方法。可以插入 set 方法最末尾而不去动主逻辑,也可以在调用使用(error.set(err).newSet(err).show();)
var error = {text:"",list: {"0":"网络开小差了,请重试","1":"接口请求超时,请重试","error":"请求数据失败,请稍后再试",},show: function(){console.log(this.text);// show pop...},//使用了lodash 库中的get方法来查找嵌套对象属性existProperty: function(obj,property){return _.get(obj,property);},set: function(err){var text = this.list[err.status];if(!text && this.existProperty(err,"response.data.message")){text = err.response.data.message;}this.text = text || this.list["error"];return this;}
}var err = {status:1,response:{data:{message:"服务端定义的msg"}}
}
// 调用
error.set(err).show();

js函数式编程之代码改善 - 封装和去重相关推荐

  1. JS函数式编程思维:柯里化、闭包

    偏函数(Partial Application): 探讨柯里化之前,我们先聊一聊很容易跟其混淆的另一个概念--偏函数(Partial Application).在维基百科中,对 Partial App ...

  2. JS函数式编程【译】5.3 单子 (Monad)

    单子是帮助你组合函数的工具. 像原始类型一样,单子是一种数据结构,它可以被当做装载让函子取东西的容器使用. 函子取出了数据,进行处理,然后放到一个新的单子中并将其返回. 我们将要关注三种单子: May ...

  3. 【基于JS 函数式编程 -1】什么是函数式编程 | 纯函数 | 命令式与声明式 | 优点

    ⭐️ 本文首发自 前端修罗场(点击即可加入),一个专注 Web 技术.答疑解惑.面试辅导.职业发展的社区. 相关文章 [函数式编程]基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式 ...

  4. JS函数式编程概念理解:函子(Functor)

    标签(空格分隔): 函数式编程 函子 functor 很多前端在学习函数式编程之前,都会被各种概念折磨的死去活来,本文的重点算是函数式编程之前的一个甜品,重点在如何切入. 函子即Functor是FP( ...

  5. js 函数式编程(一)

    函数式编程,以强调函数使用为主的开发风格,也是一种范式 函数为一等公民 js函数是一个特殊的对象,有很高的灵活性,比如函数返回一个函数,函数闭包,函数作为函数的参数,函数赋给变量,如果某个编程语言的函 ...

  6. js函数式编程最佳实践 - 持续更新

    函数式编程最佳实践 学习文档 函数式编程术语 数组字串处理 function addString(el){return el + "0"; } var newArr = arr.m ...

  7. JS函数式编程【译】5.2 函子 (Functors)

    函子(Functors) 态射是类型之间的映射:函子是范畴之间的映射.可以认为函子是这样一个函数,它从一个容器中取出值, 并将其加工,然后放到一个新的容器中.这个函数的第一个输入的参数是类型的态射,第 ...

  8. JS函数式编程【译】5.1 范畴论

    ? Functional Programming in Javascript 主目录第五章 范畴论 范畴论 范畴论是用于函数组合的理论性概念.范畴论和函数组合它俩在一起就像发动机排量和马力,像NASA ...

  9. 【读书笔记】《JS函数式编程指南》(一)

    纯函数 纯函数:函数的返回值由传入的参数决定,即相同的参数返回相同的结果. slice和splice,表现作用相似. slice浅复制,返回复制之后的数组 splice删除数组元素,返回删除元素 sl ...

最新文章

  1. 【蓝桥java】递归基础之反向输出字符串
  2. Flutter学习目录
  3. c3p0 参数 模糊查询_Hibernate day03笔记
  4. 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...
  5. Linux下source ./bashrc出现的command not found: shopt问题
  6. Android 意图(Intent) 理论详解
  7. 6个最值得Down的社交网络图标矢量素材集
  8. 水星无线网桥ssh服务器,水星路由的SSH连接步骤
  9. JAVA 使用POI读取文档
  10. ipqc异常处理流程图_品质异常该怎么处理?照这个流程走!
  11. android 谷歌地图围栏,如何在谷歌地图与c做地理围栏#
  12. UAP平台常见数据有效性数据校验
  13. 什么是中央银行数字货币 (CBDC)?为什么各国都喜欢它?
  14. widow10系统查找局域网网络计算机,Win10系统下让局域网内其他电脑通过IP访问自己电脑?...
  15. OCR文字识别标记软件--使用说明
  16. LintCode-解码方法
  17. mib browse
  18. 北风:睡后收入有哪些行业?如何打造睡后收入
  19. U盘在我的电脑里不显示,只在系统托盘区里可以检测到设备
  20. 台账系统架构及相关部署

热门文章

  1. ElementUI MessageBox 弹框
  2. 基于JAVA基于的电商平台的设计与实现计算机毕业设计源码+系统+lw文档+部署
  3. Python-基于卷积神经网络斑马线识别分类,准确率高达99%
  4. EMDrive当然是不存在的
  5. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
  6. java swing 下载_JAVA Swing 教程
  7. 在担任CEO的8年多时间里,只有3天是顺境,剩下的8年几乎全是举步维艰
  8. NKOJ P3631 密码锁
  9. python实现概率密度匹配法
  10. 缺少程序集引用:不存在类型或命名空间名称