js函数式编程之代码改善 - 封装和去重
改动前的代码,问题如下
- 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函数式编程之代码改善 - 封装和去重相关推荐
- JS函数式编程思维:柯里化、闭包
偏函数(Partial Application): 探讨柯里化之前,我们先聊一聊很容易跟其混淆的另一个概念--偏函数(Partial Application).在维基百科中,对 Partial App ...
- JS函数式编程【译】5.3 单子 (Monad)
单子是帮助你组合函数的工具. 像原始类型一样,单子是一种数据结构,它可以被当做装载让函子取东西的容器使用. 函子取出了数据,进行处理,然后放到一个新的单子中并将其返回. 我们将要关注三种单子: May ...
- 【基于JS 函数式编程 -1】什么是函数式编程 | 纯函数 | 命令式与声明式 | 优点
⭐️ 本文首发自 前端修罗场(点击即可加入),一个专注 Web 技术.答疑解惑.面试辅导.职业发展的社区. 相关文章 [函数式编程]基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式 ...
- JS函数式编程概念理解:函子(Functor)
标签(空格分隔): 函数式编程 函子 functor 很多前端在学习函数式编程之前,都会被各种概念折磨的死去活来,本文的重点算是函数式编程之前的一个甜品,重点在如何切入. 函子即Functor是FP( ...
- js 函数式编程(一)
函数式编程,以强调函数使用为主的开发风格,也是一种范式 函数为一等公民 js函数是一个特殊的对象,有很高的灵活性,比如函数返回一个函数,函数闭包,函数作为函数的参数,函数赋给变量,如果某个编程语言的函 ...
- js函数式编程最佳实践 - 持续更新
函数式编程最佳实践 学习文档 函数式编程术语 数组字串处理 function addString(el){return el + "0"; } var newArr = arr.m ...
- JS函数式编程【译】5.2 函子 (Functors)
函子(Functors) 态射是类型之间的映射:函子是范畴之间的映射.可以认为函子是这样一个函数,它从一个容器中取出值, 并将其加工,然后放到一个新的容器中.这个函数的第一个输入的参数是类型的态射,第 ...
- JS函数式编程【译】5.1 范畴论
? Functional Programming in Javascript 主目录第五章 范畴论 范畴论 范畴论是用于函数组合的理论性概念.范畴论和函数组合它俩在一起就像发动机排量和马力,像NASA ...
- 【读书笔记】《JS函数式编程指南》(一)
纯函数 纯函数:函数的返回值由传入的参数决定,即相同的参数返回相同的结果. slice和splice,表现作用相似. slice浅复制,返回复制之后的数组 splice删除数组元素,返回删除元素 sl ...
最新文章
- 【蓝桥java】递归基础之反向输出字符串
- Flutter学习目录
- c3p0 参数 模糊查询_Hibernate day03笔记
- 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...
- Linux下source ./bashrc出现的command not found: shopt问题
- Android 意图(Intent) 理论详解
- 6个最值得Down的社交网络图标矢量素材集
- 水星无线网桥ssh服务器,水星路由的SSH连接步骤
- JAVA 使用POI读取文档
- ipqc异常处理流程图_品质异常该怎么处理?照这个流程走!
- android 谷歌地图围栏,如何在谷歌地图与c做地理围栏#
- UAP平台常见数据有效性数据校验
- 什么是中央银行数字货币 (CBDC)?为什么各国都喜欢它?
- widow10系统查找局域网网络计算机,Win10系统下让局域网内其他电脑通过IP访问自己电脑?...
- OCR文字识别标记软件--使用说明
- LintCode-解码方法
- mib browse
- 北风:睡后收入有哪些行业?如何打造睡后收入
- U盘在我的电脑里不显示,只在系统托盘区里可以检测到设备
- 台账系统架构及相关部署
热门文章
- ElementUI MessageBox 弹框
- 基于JAVA基于的电商平台的设计与实现计算机毕业设计源码+系统+lw文档+部署
- Python-基于卷积神经网络斑马线识别分类,准确率高达99%
- EMDrive当然是不存在的
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
- java swing 下载_JAVA Swing 教程
- 在担任CEO的8年多时间里,只有3天是顺境,剩下的8年几乎全是举步维艰
- NKOJ P3631 密码锁
- python实现概率密度匹配法
- 缺少程序集引用:不存在类型或命名空间名称