什么是重构?
字面上的理解: 重新组织结构
为什么要重构?
原来的结构是什么样子的?有什么问题?
1. 函数逻辑结构[条件判断、循环操作]: 包含关系、集合关系、非关系...
2. 可扩展性差,新的变化不能被灵活处理
3. 对象强耦合
4. 可复用性差, 重复代码多
5. 性能消耗太多
6. 随着技术发展, 新的好特性
如何重构?
知道问题是什么, 针对问题进行重构
可扩展性差,新的变化不能被灵活处理 eg
let checkType = function(str, type) {
switch (type) {
case 'email':
return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
case 'mobile':
return /^1[3|4|5|7|8][0-9]{9}$/.test(str);
case 'tel':
return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
case 'number':
return /^[0-9]$/.test(str);
case 'english':
return /^[a-zA-Z]+$/.test(str);
case 'text':
return /^\w+$/.test(str);
case 'chinese':
return /^[\u4E00-\u9FA5]+$/.test(str);
case 'lower':
return /^[a-z]+$/.test(str);
case 'upper':
return /^[A-Z]+$/.test(str);
default:
return true;
}
}
违反开放 - 封闭原则[对扩展开放, 对修改封闭]
策略模式: 把一系列算法进行封装,使算法代码和逻辑代码相互独立
函数单一原则
let checkType = (function() {
let rules = {
email (str) {
return //.test(str);
}
...
};
return {
check (str, type) {
return rules[type]? rules[type]() : false;
}
addRule (type, fn) {
rules[type] = fn;
}
}
})();
可扩展性的表现形式
对原生对象、库、框架的扩展
1. prototype
2. jquery的扩展性
三个API:$.extend()、$.fn和$.fn.extend()
3. vue扩展
添加全局方法或属性
添加全局资源: 过滤器、指令、过渡
通过全局mixin添加一些组件选项
添加vue实例方法
基于vue的扩展[ 在组件或插件 install]
日常开发中
函数写法优化
function formatStr (str) {
return str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, '$1-$2-$3 $4:$5:$6');
}
function formatStr(str, type) {
let i = 0;
let _type = type || 'xxxx-xx-xx xx:xx:xx';
return _type.replace(/x/g, () => str[i++]);
}
function createPhoneNumber(numbers){
var format = "(xxx) xxx-xxxx";
let i = 0;
return format.replace(/x/g, () => numbers[i++]);
}
who like it?
// 模版字符串 or 手动拼写
function likes(names) {
let template = [
'no one likes this',
'{name} likes this',
'{name} and {name} likes this',
'{name}, {name} and {name} likes this',
'{name}, {name} and {n} others likes this'
];
let idx = Math.min(names.length, 4);
template[idx].replace(/{name}|{n}/g, (value) => {
return value === '{name}' ? names[idx++]: names.length;
});
}
shortest word?
// apply | call
function findShortest (s) {
return Math.min.apply(null, s.split(' ').map((val) => val.length));
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。