重构速查表

重构的相关技能
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

代码的坏味道:被滥用的面向对象

发布于 2019-03-08 | 更新于 2024-02-23

1 switch惊悚现身(Switch Statements)

一看到switch语句,就可以考虑用多态来替换它(switch常常根据类型码进行选择,你需要的是”与该类型码相关的函数或类“):

  • 使用Extract Method(提炼函数)将switch语句提炼到一个独立函数中;
  • Move Method(搬移函数)将它搬到需要多态性的那个类里;
  • 然后决定是否使用Replace Type Code with Subclasses(以子类取代类型码)Replace Type Code with State/Strategy(以State/Strategy取代类型码)
  • 接下来,就可以运用Replace Conditional with Polymorphism(以多态取代条件表达式)了。

如果只是在单一函数中有选择事例,并且不想改动他们,多态就有点大材小用了,针对这种情况,可以使用Replace Parameter with Explicit Methods(以明确函数取代参数)。如果选择条件是null,可以试试Introduce Null Object(引入Null对象)

2 令人迷惑的暂时字段(Temporary Field)

坏味道描述:某个对象内部某个实例变量仅为某种特例情况而设。

可以使用Extract Class(提炼类)给这个实例变量创造一个家,然后把变量相关的代码都放到这个新家中。还可以使用Introduce Null Object(引入Null对象)在变量不合法的情况下创建Null对象,从而避免写出条件代码。

3 异曲同工的类(Alternative Classes with Different Interfaces)

如果两个函数做同一件事情,却有不同的签名,请运用Rename Method(函数改名)根据用途重新命名。

也可以使用Extract Superclass(提炼超类)把子类相同的函数放入超类。

4 被拒绝的遗赠(Refused Bequest)

正常来说,超类支持有所有子类共享的东西,所有超类都应该是抽象的。如果子类不想要继承超类的函数和方法,就会产生坏味道,但这种坏味道不是太强烈。

为了修复这种继承提醒错误,需要为子类新建一个兄弟类,再运用Push Down Method(函数下移)Push Down Field(字段下移)把所有用不到的函数下推给那个兄弟。

拒绝继承超类的实现,这一点我们不介意,但是如果拒绝继承超类的接口,我们不以为然。这个时候应该应用Replace Inheritance with Delegation(以委托取代继承)来达到目的。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/refactoring/code-small-oo-abusers.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。