Java项目工程重构

重构是一个老生常谈的话题。

1、什么是重构

    重构是不改变项目现有的业务逻辑或者代码逻辑,对程序进一步提炼或者扩展,使其在结构上更容易理解,代码的规范性更强,耦合性更弱。非常重要的一点,重构与性能没有必然的关系。

2、为什么重构

    当看到一个函数上千行代码,有没有心累?当看到一个类巨大,改一行代码结果整个程序就运行不起来了,要不要崩溃?更关键的是,调用了很长一串函数,每个函数干了谁都不知道的逻辑,还有一些甚至重复的函数功能, 想不想骂娘?奇葩的是,就是看这段代码不顺眼,看起的名字超出常识,有更显逼格的设计模式应用,能不能重写?

    诸如此类的原因,都是代码重构的原因。当然,通常情况下有两种场景不得不进行重构:1)业务发展到一定阶段,原来的程序设计不能满足业务需求,或者经过N多遍更改后,存在大量“不知所谓”的逻辑代码;2)引入新的架构设计,进行业务拆分。

3、怎么进行重构

重构的前提是找到有坏味道的代码,典型的坏味道代码有:

1)重复代码,对于相同的逻辑需要抽公共的方法或者类;

2)过长的函数(一般超过200行),需要积极的拆分子函数;

3)过大的类,类越大,职责就越多,导致类产生的实例也会越多。同时,职责越多的类,其修改后影响也就越大。

4)过长的参数列表,如果参数过多,或者变化太过频繁,考虑用对象替换参数列表;

5)发散式变化,如果类经常在不同的方向上发生变化,考虑将类拆分。

6)散弹式修改,与发散式变化刚好相反,如果遇到某种变化要修改很多地方,可以考虑将变化的抽到同一个类中。

7)依恋情结,就是如果某个函数功能需要调用另一个类中的大半变化,可以考虑将这个函数抽到变化的类中。

8)数据泥团,数据项总是喜欢成群结队的聚在一起,可以考虑对数据项抽象对象。

9)平行继承体系,就是为某个类增加一个子类的时候,也必须为另一个类增加子类,这时候可以考虑让一个继承体系引用另一个继承体系。

10)冗赘类

11)夸夸其谈的未来性,就是设计的时候过多考虑未来,导致现有的类设计复杂

12)过度耦合的消息链。

    I. 小步前进,频繁测试

1)重新提炼函数,是最常见的重构手法;

2)内联函数或者临时变量,就是收缩函数或者临时变量。比如内联临时变量的时候,直接用返回函数的表达式代替临时变量。

3)用函数对象取代函数,就是将函数放到单独的对象中,这样局部变量就变成里对象字段,有助于拆分函数。

4)替换算法,用另一个更清晰的算法替换到现有算法。

    II. 在对象之间搬移特性

1)搬移函数,就是将现有函数的实现逻辑搬移到一个新的常引用的类中,在本类中建立一个委托函数,调用新类中的新函数。

2)搬移字段,

3)提炼类,建一个新类,将相关的字段和函数从旧类中搬移;

4)移除中间人

5)引入外加函数,就是在提供类中创建一个函数,但是并不改变提供类。

6)以对象取代数据值,就是将数据项封装为对象。

7)将值引用替换为对象引用,或者将对象引用替换为值引用。

8)条件表达式分解,即条件变为函数。

9)用return表示条件结束,即使用卫语句,要么结束,要么抛出异常。

10)引入Null对象,引入断言



/* * 原始需求背景: * 网宿CDN要按月收取客户的服务费用,根据流量的大小、 * 服务的类型等,收取不同的费用,收费规则如下: * web应用:1000元/M * 流媒体应用:1000元/M*0.7 * 下载应用:1000元/M*0.5 * 月末打印报表时,要罗列每个用户每个频道的费用、客户总费用, * 还要打印该客户的重要性指数,重要性指数=网页流/100+下载流量/600; * * 需求变更场景: * 系统已经开发出来了,接下来,运维部门现在希望对系统做一点修改, * 首先,他们希望能够输出xml,这样可以被其它系统读取和处理,但是, * 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * 不久,成本中心又要求修改计费规则,于是我们必须同时修改xmlReport() * 和report(),并确保其一致性,当后续还要修改的时候,复制-黏贴的问题就 * 浮现出来了,这造成了潜在的威胁。 * 再后来,客服部门希望修改服务类型和用户重要性指数的计算规则, * 但还没决定怎么改,他们设想了几种方案,这些方案会影响用户的计费规则, * 程序必须再次同时修改xmlReport()和report(),随着各种规则变得越来越复杂, * 适当的修改点越 来越难找,不犯错误的机会越来越少。 * 现在,我们运用所学的OO原则和方法开始进行改写吧。 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值