优化代码的几个小技巧

前言

最近看了《重构-改善既有代码的设计》这本书,总结了优化代码的几个小技巧,给大家分享一下。

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

提炼函数(适当抽取小函数)

定义

提炼函数就是将一段代码放进一个独立函数中,并让函数名称解释该函数用途。

一个过于冗长的函数或者一段需要注释才能让人理解用途的代码,可以考虑把它切分成一个功能明确的函数单元,并定义清晰简短的函数名,这样会让代码变得更加优雅。

优化例子

提炼函数之前:

private String name;
private Vector orders = new Vector();

public void printOwing() {
//print banner
System.out.println(“");
System.out.println("*****customer Owes *****");
System.out.println("
”);

//calculate totalAmount
Enumeration env = orders.elements();
double totalAmount = 0.0;
while (env.hasMoreElements()) {
    Order order = (Order) env.nextElement();
    totalAmount += order.getAmout();
}

//print details
System.out.println("name:" + name);
System.out.println("amount:" + totalAmount);

}

提炼函数之后:

以上那段代码,可以抽成print banner,calculate totalAmount,print details三个功能的单一函数,如下:

private String name;
private Vector orders = new Vector();

public void printOwing() {

//print banner
printBanner();
//calculate totalAmount
double totalAmount = getTotalAmount();
//print details
printDetail(totalAmount);

}

void printBanner(){
System.out.println(“");
System.out.println("*****customer Owes *****");
System.out.println("
”);
}

double getTotalAmount(){
Enumeration env = orders.elements();
double totalAmount = 0.0;
while (env.hasMoreElements()) {
Order order = (Order) env.nextElement();
totalAmount += order.getAmout();
}
return totalAmount;
}

void printDetail(double totalAmount){
System.out.println(“name:” + name);
System.out.println(“amount:” + totalAmount);
}

内联函数(适当去除多余函数)

定义

内联函数就是在函数调用点插入函数本体,然后移除该函数。

上一小节介绍了提炼函数代码优化方式,以简短清晰的小函数为荣。但是呢,小函数是不是越多越好呢?肯定不是啦,有时候你会遇到某些函数,其内部代码和函数名称同样清晰,这时候呢你可以考虑内联函数优化一下了。

优化例子

内联函数之前

int getRating(){
return moreThanFiveDeliveries() ? 2 : 1;
}
boolean moreThanFiveDeliveries(){
return numberOfLateDeliveries >5;
}

内联函数之后

  int getRating(){
        return numberOfLateDeliveries >5 ? 2 : 1;
 }

内联临时变量(去除多余临时变量)

定义

内联临时变量将所有对该变量的引用动作,替换为对它赋值的那个表达式自身。

优化例子

内联临时变量之前

double basePice = anOrder.basePrice();
return basePice >888;

内联临时变量之后

 return anOrder.basePrice() >888;

引入解释性变量

定义

引入解释性变量 就是将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

有些表达式可能非常复杂难于阅读,在这种情况下,临时变量可以帮助你将表达式分解为可读的形式。

在比较复杂的条件逻辑中,你可以用引入解释性变量将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。

优化例子

引入解释性变量之前

if ((platform.toUpperCase().indexOf("mac") > -1) &&
    (brower.toUpperCase().indexOf("ie") > -1) &&
    wasInitializes() && resize > 0) {
        ......
    }

引入解释性变量之后

final boolean isMacOS = platform.toUpperCase().indexOf("mac") > -1;
final boolean isIEBrowser = brower.toUpperCase().indexOf("ie") > -1;
final boolean wasResized = resize > 0;

if (isMacOS && isIEBrowser && wasInitializes() && wasResized) {
    ......
}

以字面常量取代魔法数

定义

创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

所谓魔法数是指拥有特殊意义,却又不能明确表现出这种意义的数字。如果你需要在不同的地点引用同一个逻辑数,每当该数字要修改时,会特别头疼,因为很可能会改漏。而字面常量取代魔法数可以解决这个头疼问题。

优化例子

以字面常量取代魔法数之前

double getDiscountPrice(double price){
       return price * 0.88;
 }

以字面常量取代魔法数之后

 static final double DISCOUNT_CONSTANT=0.88;
 
 double getDiscountPrice(double price){
     return price * DISCOUNT_CONSTANT;
 }

用多态替代switch语句

定义

用多态替换switch语句 就是利用Java面向对象的多态特点,使用state模式来替换switch语句。

优化例子

用多态替换switch语句之前

 int getArea() {
        switch (shape){
        case SHAPE.CIRCLE:
        return 3.14 * _r * _r; break;
        case SHAPE.RECTANGEL;
        return width *,heigth;
        }
    }

用多态替换switch语句之后

 class Shape {
        int getArea(){};
    }

    class Circle extends Shape {
        int getArea() {
            return 3.14 * r * r; 
        }
    }

    class Rectangel extends Shape {
        int getArea() {
            return width * heigth;
        }
    }

将过多的参数对象化

定义

将过多的参数对象化就是把涉及过多参数封装成一个对象传参。

一个方法有太多传参时,即难以阅读又难于维护。尤其针对dubbo远程调用这些方法,如果有过多参数,增加或者减少一个参数,都要修改接口,真的坑。如果把这些参数封装成一个对象,就很好维护了,不用修改接口。

优化例子

将过多的参数对象化之前:

public int register(String username,String password,Integer age,String phone);

将过多的参数对象化之后:

 public int register(RegisterForm from );
 
 class RegisterForm{
     private String username;
     private String password;
     private Integer age;
     private String phone;
 }

参考与感谢

  • 《重构-改善既有代码的设计》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@echo off ::automatic updates -windows自动更新,靠,滚! sc stop wuauserv sc config wuauserv start= disabled ::clipbook - 用与局域网电脑来共享 粘贴/剪贴的内容。(靠,想得出!) sc stop clipsrv sc config clipsrv start= disabled ::com+Event system -一些 COM+ 软件需要,检查你的 c:\program files\ComPlus Applications 目录,没东西可以把这个服务关闭. sc stop eventsystem sc config eventsystem start= disabled ::COM+Event system application -同上 sc stop comsysapp sc config comsysapp start= disabled ::COmputer browser - 用来浏览局域网电脑的服务,但关了也不影响浏览!垃圾 sc stop Browser sc config Browser start= disabled ::DHCP client-静态IP者需要(xDSL 等)小猫就不用了!! sc stop dhcp sc config dhcp start= disabled ::Distributed link tracking client-用于局域网更新连接信息,比如在电脑A有个文件,在B做了个连接,如果文件移动了,这个服务将会更新信息。占用4兆内存。 sc stop trkwks sc config trkwks start= disabled ::Distributed Transaction coordinator-无聊的东西。 sc stop msdtc sc config msdtc start= disabled ::DNS Client-DNS解析服务。。无聊~~ sc stop dnscache sc config dnscache start= disabled ::Fast user switching compatibility-多用户快速切换服务..无聊 sc stop fastuserswitchingcompatibility sc config fastuserswitchingcompatibility start= disabled ::IMAPI CD-burning COM service -xp刻牒服务,用软件就不用了占用1。6兆内存 sc stop imapiservice sc config imapiservice start= disabled ::IPSEC Services-大众用户连边都沾不上。 sc stop policyagent sc config policyagent start= disabled ::Logical Disk manager -磁盘管理服务。。需要时它会通知你,所以一般关。 sc stop dmserver sc config dmserver start= disabled ::Logical Disk manager administrative service-同上。 sc stop dmadmin sc config dmadmin start= disabled ::messenger -不是msn,不想被骚扰的话就关。注:妖刺就是利用这个。 sc stop messenger sc config messenger start= disabled ::Net Logon-登陆domai controller 用的,大众用户快关! sc stop netlogon sc config netlogon start= disabled ::Netmeeting remote desktop sharing-用netmeeting实现电脑共享。。晕!关! sc stop mnmsrvc sc config mnmsrvc start= disabled ::Network DDE -和clipbook一起用的,无聊~~~~ sc stop netdde sc config netdde start= disabled ::Network DDE DSDM -同上 sc stop netddedsdm sc config netddedsdm start= disabled ::Network Location Awareness-如有网络共享或ICS/ICF可能需要.(服务器端) sc stop nla sc config nla start= disabled ::NT LM Security support provider-telnet 服务用的东东,关!! sc stop ntlmssp sc config ntlmssp start= disabled ::NVIDIA Driver Helper service -nvidia 显卡帮助,关! sc stop dnscache sc config dnscache start= disabled ::Portable media serial number-绝对无用,无聊之及。 sc stop wmdmpmsn sc config wmdmpmsn start= disabled ::QoS RSVP -关!就是那个20%的 QoS sc stop rsvp sc config rsvp start= disabled ::Remote desktop help session manager-远程帮助服务,傻透,占用4兆内存。 sc stop rdsessmgr sc config rdsessmgr start= disabled ::remote registry -远程注册表运行/修改。大漏洞,还不快关!! sc stop remoteregistry sc config remoteregistry start= disabled ::routing and remote access-哈哈。。不知者关! sc stop remoteaccess sc config remoteaccess start= disabled ::secondary logon-给与administrator 以外的用户分配指定操作权.晕~~~ sc stop seclogon sc config seclogon start= disabled ::server -局域网文件/打印共享需要的。 sc stop lanmanserver sc config lanmanserver start= disabled ::smart card -关!1。4兆内存 sc stop scardsvr sc config scardsvr start= disabled ::SSDP Discovery service-没有什么硬件利用这个服务。。 sc stop ssdpsrv sc config ssdpsrv start= disabled ::system restore service -系统还原服务,吃资源和内存的怪兽。。虽然有时用到,自己决定。 sc stop srservice sc config srservice start= disabled ::TCP/IP NetBIOS helper-如果你的网络不用 Netbios 或WINS,关了. sc stop lmhosts sc config lmhosts start= disabled ::telnet -大漏洞,我第一个关的就是这个.这根dos中 telnet 命令没关系。2兆内存。 sc stop tlntsvr sc config tlntsvr start= disabled ::universal plug and play device host-同SSDP Discovery Service ,没用. sc stop upnphost sc config upnphost start= disabled ::volume shadow copy-同MS Software Shadow Copy Provider,无用. sc stop vss sc config vss start= disabled ::Windows Installer -windows的MSI安装服务,建议设成手动。 sc stop msiserver sc config msiserver start= demand

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值