提升代码质量丨“提炼函数”篇

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(提炼函数)需要考虑的几种情况:

  1. 提炼函数时,考虑有/无局部变量;

  2. 有局部变量时,是只读变量值,还是会对变量再赋值;

  3. 对变量再赋值时,变量是在提炼代码段内使用,还是在提炼代码段之外的代码也使用。




喜欢就请关注吧

长按二维码关注

【wangpei_s】


以上是关于提升代码质量丨“提炼函数”篇的主要内容,如果未能解决你的问题,请参考以下文章

三年无bug,提升代码质量的秘诀

干货分享丨研发代码质量管理技术最佳实践

代码质量堪忧?用 detekt 呀,拿捏得死死的~

SPIChina丨京东商城代码质量平台建设实践

百源汇于数据仓库,莫让数据“流浪地球”丨教育统计优秀案例②

开篇│“提升代码质量”专题系列——证券软件总部持续推进质量提升计划