今天让咱们来继续第3天,老规矩先来回顾一下昨天咱们都实现了哪些:html
- Change Reference to Value(将引用对象改成值对象)
- Change Value to Reference(将值对象改成引用对象)
- Collapse Hierarchy(折叠继承体系)
(图片:博格达峰)
前端
简单理解就是不改变软件可观察行为的前提下,改善其内部结构,以提升理解性和下降修改为本。面试
描述🍏:你有一些列的条件测试都获得了相同的结果,你能够将这些测试合并为一个条件表达式,并将这个条件表达式提炼为一个独立的函数。算法
动机🍃: 检查条件各不相同,行为一直就应该使用“逻辑或”和“逻辑与”将他们合并为一个条件表达式。typescript
interface ConfigFn {
(): number;
}
const disabilityAmount: ConfigFn = (): number => {
if (_seniority < 2) return 0;
if (_monthsDisabled > 12) return 0;
if (_isPartTime) return 0;
};
复制代码
在这段代码中,咱们看到一连串的条件检查,它们都作同一件事。上述条件检查等价于一个以逻辑或链接起来的语句:shell
const disabilityAmount: ConfigFn = (): number => {
(_seniority<2)||(_monthsDisabled>12)||(_isPartTime))return 0;
}
//继续改造
const isNotEligible = ():boolean=>{
return (_seniority<2)||(_monthsDisabled>12)||(_isPartTime));
}
const onVacation = ():boolean=>{}
const disabilityAmount = (): number => {
// 这里也可使用逻辑与继续更复杂的应用
// if(isNotEligible){
if(isNotEligible && onVacation){
return 0;
}
}
复制代码
描述🐥:在条件表达式的每一个分支上有着相同的一段代码,将这段代码搬到条件表达式以外。编程
动机🐈:移除相同的重复代码才更更清楚的代表哪些东西随条件的变化而变化,哪些东西保持不变。json
// 简单版本 好比koa2的输出
if(flag){
const data = "老袁";
res.end(data)
}else{
const data = {
"message":"老袁"
}
res.end(data)
}
//改造后
let data = "默认信息";
if(flag){
data = "老袁";
}else{
data = {
"message":"老袁"
}
}
res.end(data)
复制代码
咱们在来看看复杂的版本:数组
//编写.jscpd.json
{
"mode": "strict",
"threshold": 0,
"reporters": ["html", "console", "badge"]
}
复制代码
yarn add jscpd -D
yarn add jscpd-badge-reporter -D
jscpd ./src
复制代码
补一张效果图:markdown
固然这只是一个小工具,你们想专业的刷起来Sonar。
描述🌾:你手上有一些传统过程化的代码,没有任何封装。现咱们可将数据记录变成对象,将大块的行为分红小块,并将行为移入到相关对象之中。
动机🐻:有一次我看到过带的一个实行生一个纯的函数120多行,这个时候咱们就能够用一些小型对象改变宿主对象的行为。长长的函数通常都是你下手这条规定的最佳时机。
这里我就不啰嗦了,但愿你们有时间能够静下来在好好看看除了封装、继承、多态外基于SOLID的设计,其实足够了。
函数式编程和SOLID实际上是相辅相成的。
回顾第一天的文章👉 :《重构-代码整洁之道TypeScript版》第一天
回顾次日的文章👉 :《重构-代码整洁之道TypeScript版》次日
每一次咱们不会给你们写过多的重构规则,力求天天用几分钟时间真正去理解了重构。明天见~若是您有什么意见和反馈,欢迎您在下方留言。
做者 【老袁】 2020 年 07月 30日