提升代码质量丨“提炼函数”篇
Posted 彪悍猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提升代码质量丨“提炼函数”篇相关的知识,希望对你有一定的参考价值。
工作一段儿时间后,你会发现,写代码不算难,难的是写出可读性更高、扩展性更好的高质量代码。
因为任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人容易理解的代码,才是优秀的程序员。把代码写高级,更是从初级迈向中高级的必修之路。
在工作中,我们可能花在阅读和修改代码的时间,比开发时间更多。如何让经我们手的代码,质量变的更好、可读性更强,在这里我梳理一个简单而又常用的重构手法:Extract Method(提炼函数)。
当我们遇到重复代码,或函数过长时,可以考虑使用提炼函数手法,将一段代码放进一个独立函数中。
当我们提炼函数时,需要考虑两种情况:
无局部变量
有局部变量
无局部变量
无局部变量的提炼,异常简单,请看以下代码示例。
提炼前代码:
void printOwing() {
Enumeration e = orders.elements();
double outstanding = 0.0;
// print banner
System.out.println("此行代码被提炼提炼”);
// calculate outstanding
while(e.hasMoreElements()) {
Order each = (Order)e.nextElement();
outstanding += each.getAmount();
}
// print details
System.out.println("name:" + name);
System.out.println("amount" + outstanding);
}
提炼后代码(标蓝色):
void printOwing() {
Enumeration e = orders.elements();
double outstanding = 0.0;
// print banner
printBanner();
// calculate outstanding
while(e.hasMoreElements()) {
Order each = (Order)e.nextElement();
outstanding += each.getAmount();
}
// print details
System.out.println("name:" + name);
System.out.println("amount" + outstanding);
}
private void printBanner() {
System.out.println("此行代码被提炼提炼”);
}
有局部变量
有局部变量有两种情况:
提炼函数,只读取变量值
提炼函数,对变量再赋值
只读取变量值
从简单的示例说起,被提炼代码段只是读取局部变量的值,不修改它们。
提炼前代码:
void printOwing() {
Enumeration e = orders.elements();
double outstanding = 0.0;
printBanner();
// calculate outstanding
while(e.hasMoreElements()) {
Order each = (Order)e.nextElement();
outstanding += each.getAmount();
}
// print details
System.out.println("name:" + name);
System.out.println("amount" + outstanding);
}
提炼后代码(标蓝色):
void printOwing() {
Enumeration e = orders.elements();
double outstanding = 0.0;
printBanner();
// calculate outstanding
while(e.hasMoreElements()) {
Order each = (Order)e.nextElement();
outstanding += each.getAmount();
}
// print details
printDetails(outstanding);
}
void printDetails(double outstanding) {
System.out.println("name:" + name);
System.out.println("amount" + outstanding);
}
对局部变量再赋值
变量再赋值也分为两种情况:
变量只在提炼代码段中使用
提炼代码段之外的代码使用此变量
变量只在提炼代码段中使用
提炼前代码:
void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
printBanner();
while (e.hasMoreElements()) {
Order each = e.nextElement();
outstanding += each.getAmount();
}
printDetails(outstanding);
}
提炼后代码(标蓝色):
void printOwing() {
printBanner();double outstanding = outstanding();
printDetails(outstanding);
}
private double outstanding() {
Enumeration e = _orders.elements();
double result = 0.0;
while (e.hasMoreElements()) {
Order each = e.nextElement();
result += each.getAmount();
}
return result;
}
提炼代码段之外的代码使用此变量
提炼前代码:
void printOwing(double previousAmount) {
Enumeration e = _orders.elements();
double outstanding = previousAmount * 1.2;
printBanner();
while (e.hasMoreElements()) {
Order each = e.nextElement();
outstanding += each.getAmount();
}
printDetails(outstanding);
}
提炼后代码(标蓝色):
void printOwing(double previousAmount) {
double outstanding = previousAmount * 1.2;
printBanner();
outstanding = outstanding(outstanding);
printDetails(outstanding);
}
private double outstanding(double initialValue) {
Enumeration e = _orders.elements();
double result = initialValue;
while (e.hasMoreElements()) {
Order each = e.nextElement();
result += each.getAmount();
}
return result;
}
小结
最后小结一下Extract Method(提炼函数)需要考虑的几种情况:
提炼函数时,考虑有/无局部变量;
有局部变量时,是只读变量值,还是会对变量再赋值;
对变量再赋值时,变量是在提炼代码段内使用,还是在提炼代码段之外的代码也使用。
喜欢就请关注吧
长按二维码关注
【wangpei_s】
以上是关于提升代码质量丨“提炼函数”篇的主要内容,如果未能解决你的问题,请参考以下文章