重构--有效设计代码

本文总结了《重构 - 改善既有代码的设计》相关内容。介绍了重构是对软件内部结构调整,目的是提高可理解性、降低修改成本。阐述了重构原因,如代码风格杂乱、缺乏扩展性等,还提及三次法则及重构时机,指出代码坏味道,并给出提炼函数、引入解释性变量等重构方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在读《重构-改善既有代码的设计》,对其简单进行了一下总结,但是对于里面大多数内容,认为都是无关紧要的。

姑且先简单写一下,如果后续有比较好的重构理念,再进行补充

 

重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

原因:

当人们只为短期目的,或是在完全理解整体设计之前,就贸然修改代码,程序将逐渐失去自己的结构,程序员越来越难通过阅读源码而理解原来的设计。

1、代码经过很多人的手,时间变长,每个人的风格不同,是代码变得杂乱

2、写代码时为了短期目的,只为满足功能,没有考虑扩展性与可理解性

 

三次法则:事不过三,三则重构

第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构。

添加功能时重构;复审代码时重构;修补错误时重构。

代码的坏味道:

重复代码、过长函数、过大的类、过长的参数列、发散式变化、数据泥团、switch、过多的注释

 

提炼函数:针对过长的函数

可以将部门独立的功能抽取出来,作为单独的函数来调用。同时函数名要能代表抽取这部分代码的功能,使人容易理解。

同时要注意是否引用局部变量,处理好局部变量与抽取新函数之间的调用关系。

拆分时注意不要粒度过于细,否则会造成函数功能过于简单,同时数量太多,反而不利于维护
 

void printinfo(){

        printBanner();

        System.out.println("print test");

        System.out.println("print info");

    }

 

void printinfo(){

        printBanner();

        printInfo();

    }

    void printInfo(){

        System.out.println("print test");

        System.out.println("print info");

    }

  

2、引入解释性变量

表达式有可能非常复杂而难以阅读,这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式

boolean volumeAndCommissionRate = (volume==0) && (commissionRate >=50) && userType.equals("0") &&

                        (null == dsr || dsr==50000 || dsr==0);

                

boolean volumeAndPrice = (volume==0) && (zkFinalPrice==0.1 || zkFinalPrice==0.01) && userType.equals("0");

               

boolean priceAndDsr = first && ( dsr==0 || null == dsr || dsr==50000 ) && (zkFinalPrice<=1) && userType.equals("0");

                

if(priceAndCommissionRate || volumeAndCommissionRate || volumeAndPrice || priceAndDsr){

     System.out.println("test info");

}
if((volume==0) && (commissionRate >=50) && userType.equals("0") &&

                        (null == dsr || dsr==50000 || dsr==0) || (volume==0) && (zkFinalPrice==0.1 || zkFinalPrice==0.01) && userType.equals("0") || first && ( dsr==0 || null == dsr || dsr==50000 ) && (zkFinalPrice<=1) && userType.equals("0")){

    System.out.println("test info");

}

 

3、移除对参数的赋值

当函数对传入的基本类型的参数,进行操作时,可能会造成语义不清,所以建议如果对变量进行修改,建议赋值给一个新的变量,然后进行操作,这样就能体现函数所带来的变化。

int count(int v1,int v2){

    return v1*89+100

}
int count(int v1,int v2){

    int temp = v1*89+100;

    return temp;

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值