探究重构代码(Code refactoring)
Code refactoring 是什么
在不改变软件的外部行为的条件下,通过修改代码改变软件内部结构,将效率低下和过于复杂的代码转换为更高效、更简单和更简单的代码。
怎样执行Code refactoring
1.重命名
例子:命名语意不明。
//重构前
let show = true; function name(){} //重构后
let isShow=true; function getName(){}
2.提取
例子:不同函数名,相同功能函数
//重构前
function sayHello(){
console.log('Hello World')
} function sayBye(){
console.log('GoodBye World')
} sayHello()
sayBye() //重构后
function say(str){
console.log(str)
} say('Hello World')
say('GoodBye World')
例子:减少参数
//重构前
function peopleInfo(name, age) {
console.log('My name is ' + name + ',' + age + ' years old.')
} peopleInfo('Sroot', 18) //重构后
function peopleInfo(people) {
console.log('My name is ' + people.name + ',' + people.age + ' years old.')
} peopleInfo({
name: 'Sroot',
age: 18
})
3.封装
例子:功能封装。
//重构前
function setCookie(name, value) {
var Days = 30
var exp = new Date()
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString()
}
function getCookie(name) {
var arr,
reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
if ((arr = document.cookie.match(reg))) return unescape(arr[2])
else return null
} setCookie('key', 'sroot')
getCookie('key') //重构后
var Cookies = {
setCookie: function(name, value) {
var Days = 30
var exp = new Date()
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString()
},
getCookie: function(name) {
var arr,
reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
if ((arr = document.cookie.match(reg))) return unescape(arr[2])
else return null
}
} Cookies.setCookie('key', 'sroot')
Cookies.getCookie('key')
例子:控制结构和逻辑问题
//重构前
if (isOpenSound === true) {
console.log("It's open sound")
} //重构后
if (isOpenSound) {
console.log("It's open sound")
} //另一种写法
isOpenSound && console.log("It's open sound")
4.扩展
例子:定义变量、方法没有使用。
let name='sroot'; function say(){
console.log('hello world')
}
例子:使用相同的代码
let files = ["a.png","b.png"]
let fd = new FormData() //重构前
fd.append('file1',files[0])
fd.append('file2',files[1]) //重构后
for (let i = 0; i < files.length; i++) {
fd.append('file' + i, files[i])
}
5.性能优化。
例子:循环语句性能优化
//重构前
var text = ''
for (i = 0; i < 10; i++) {
text += i + '++'
document.getElementById('demo').innerHTML = text
} //重构后
var text = ''
for (i = 0; i < 10; i++) {
text += i + '++'
}
document.getElementById('demo').innerHTML = text
PS:代码重构应该注意一下几点:
(1)重构自己的代码,不要重构别人写的代码。(自己的问题自己解决)
(2)重构代码不要整合新的功能代码。( 明确自己的目的,不要弄巧成拙)
(3)重构代码之后一定要进行测试。(软件测试是检查软件质量的唯一标准)
Code refactoring的优缺点
优点:提高代码质量,优化软件产品架构与性能,减少项目的技术债,避免项目重写。(重构 != 重写)
缺点:增加工作负担,可能会出现一些业务上漏洞,也可能代码过于精炼导致代码可读性变差。
总结: 代码重构是个好方法,代码重构是需要单元测试与自动化测试来支持,否则适得其反,请不要轻易重构代码。
探究重构代码(Code refactoring)的更多相关文章
- 探究代码审查(Code review)
Code review 是什么 对软件源代码的系统性检查,查找软件源代码质量,结构,漏洞等问题. PS:Code review ≍ Code inspections ≥ Code walkthrou ...
- 重构现有代码:Refactoring
重构现有代码:Refactoring 1.WHY SHOULD WE REFACTOR? 1.Refactoring Improves the Design of Software Without r ...
- 第四章:重构代码[学习Android Studio汉化教程]
第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight p ...
- Winform打砖块游戏制作step by step第5节---重构代码,利用继承多态
一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 二 本节内容---重构代码,利用继承多态 1. 主界面截图如下: 2. ...
- eclipse 重构代码自动抽取函数
1.选择重构代码段 2.重构 – 抽取方法 3.命名重构代码段抽取的方法 4.使用抽取的方法
- BNUOJ 19297 Code Refactoring
Code Refactoring Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Ori ...
- 代码code设置9.png/9-patch 图片背景后,此view中的TextView等控件显示不正常
代码code设置9.png/9-patch 图片背景后,此view中的TextView等控件显示不正常 设置 padding=0
- amazeui学习笔记--css(HTML元素2)--代码Code
amazeui学习笔记--css(HTML元素2)--代码Code 一.总结 1.行内代码:code标签<code> 2.代码片段:pre标签<pre> 3.限制代码块高度:添 ...
- 使用IDEA重构代码
使用IDEA提供的快捷操作,高效快速重构代码. 常用重构快捷菜单 Shift+F6,重构 - 重命名 Ctrl+Alt+m,提取方法 F6,移动方法
随机推荐
- django admin站点美化
使用django-simpleui 安装 pip install django-simpleui 源码地址 https://github.com/newpanjing/simpleui django ...
- 枚举java语言中的修饰符组合
package model; /*22:37 2019/7/20*/ /* top class的修饰符组合 abstract final public 2 * 2 * 2 warning: abstr ...
- paramiko模块(基于SSH用于连接远程服务器)
paramiko模块,基于SSH用于连接远程服务器并执行相关操作 class SSHConnection(object): def __init__(self, host_dict): self.ho ...
- java 并发编程lock使用详解
浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...
- 缺少库libresolv
"_dns_free_resource_record", referenced from: -[xxxx processRecord:length:] in xxx.a(xxx.o ...
- Linux安装FastDFS~Nginx~
确保Linux联网,我这里使用的是CentOS7操作,联网教程 https://www.cnblogs.com/taopanfeng/p/10978752.html 先把指定的四个文件放入指定目录 安 ...
- initlocation - 创建一个从属的 PostgreSQL数据库存储区
SYNOPSIS initlocation directory DESCRIPTION 描述 initlocation 创建一个新的PostgreSQL从属数据库存储区.参阅 CREATE DATAB ...
- tomcat+redis接上篇
数据库允许远程连接 把数据库中的mysql数据库中的user表里的host项为localhost的改为 % update user set host = '%' where user = 'root' ...
- SpringCloud系列(一):Eureka 服务注册与服务发现
上一篇,我们介绍了服务注册中心,光有服务注册中心没有用,我们得发服务注册上去,得从它那边获取服务.下面我们注册一个服务到服务注册中心上去. 我们创建一个 hello-service 的 spring ...
- opencv-python用原图和mask实现抠图
1.先上图 原图:test1.png mask图:test-mask.png 结果图:mask.png 2.代码部分 import cv2 from PIL import Image import n ...