理解:本文中的”去除上帝类”是指把一个看似功能很强且很难维护的类,按照职责把自己的属性或方法分派到各自的类中或分解成功能明确的类,从而去掉上帝类。

详解:我们经常可以在一些原来的代码中见到一些类明确违反了SRP原则(单一原则),这些类通常以“Utils”或“Manager”后缀结尾,但有时这些类也没有这些特征,它仅仅是多个类多个方法的组合。另一个关于上帝类的特征是通常这些类中的方法被用注释分隔为不同的分组。那么久而久之,这些类被转换为那些没有人愿意进行归并到合适类的方法的聚集地,对这些类进行重构是将类中的代码按照职责分派到各自的类中,这样就解除了上帝类,也减轻了维护的负担。

  public class CustomerService
{
public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
{
// do work
} public bool CustomerIsValid(Customer customer, Order order)
{
// do work
} public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
{
// do work
} public void Register(Customer customer)
{
// do work
} public void ForgotPassword(Customer customer)
{
// do work
}
}

我们看到要重构上面的代码是很简单的,只要将相关的方法按职责分派到对应的类中即可,带来的好处就是这会降低代码的颗粒度并减少未来维护代码的成本。下面是重构后的代码,它将上面的代码按照职责分为了两个不同的类。

  public class CustomerOrderService
{
public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
{
// do work
} public bool CustomerIsValid(Customer customer, Order order)
{
// do work
} public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
{
// do work
}
} public class CustomerRegistrationService
{ public void Register(Customer customer)
{
// do work
} public void ForgotPassword(Customer customer)
{
// do work
}
}

”去除上帝类“是我们经常容易造成的,第一是因为简便,看到有一个现成的类,大家都会喜欢把代码往里面写,最后导致越写越大,并且声明功能都有,这样即降低了可读性,也造成了维护的负担。

重构第27天 去除上帝类(Remove God Classes)的更多相关文章

  1. 重构第29天 去除中间人对象(Remove Middle Man)

    理解:本文中的”去除中间人对象”是指把 在中间关联而不起任何其他作用的类移除,让有关系的两个类直接进行交互. 详解:有些时候在我们的代码会存在一些”幽灵类“,设计模式大师Martin Fowler称它 ...

  2. Spring Boot2(006):关于配置类(Configuration Classes)和配置(Configuration)

    一.配置类(Configuration Classes) Spring Boot 支持基于 xml 的配置,但更偏向于使用基于 Java 的配置,通常建议使用定义有 main 方法的主 @Config ...

  3. 重构第19天 提取工厂类(Extract Factory Class)

    理解:本文中的“提取工厂类”是指如果要创建的对象很多,则代码会变的很复杂.一种很好的方法就是提取工厂类. 详解:一般来说我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来 ...

  4. [Swift]LeetCode316. 去除重复字母 | Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  5. java 27 - 1 反射之 类的加载器

    说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...

  6. 重构第26天 移除双重否定(Remove Double Negative)

    理解:”移除双重否定”是指把代码中的双重否定语句修改成简单的肯定语句,这样即让代码可读,同时也给维护带来了方便. 详解:避免双重否定重构本身非常容易实现,但我们却在太多的代码中见过因为双重否定降低了代 ...

  7. 重构SP5中声明自定义扩展类为API调用

    展的自定义类方法想要被前端异步调用必须在方法中 1.首先类必须继承自 AppService 类 2.方法必须指定特性 [ActionDescription("名称","编 ...

  8. 重构指南 - 移除重复内容(Remove Duplication)

    在项目中或多或少的都存在着重复的或者功能相似的代码,如果要对代码做改动,就要修改多个地方,所以我们需要将多处重复的代码提取到一个公共的地方供统一调用,以减少代码量,提高代码可维护性. 重构前代码 pu ...

  9. LeetcCode 27:移除元素 Remove Element(python、java)

    公众号:爱写bug 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...

随机推荐

  1. 在DataTable中执行DataTable.Select("条件")返回DataTable;

    转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...

  2. 仿网易漂亮的TAB选项卡(标签)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Tomcat8配置数据库连接池

    1.所有的tomcat项目共用一个连接池配置 1.1 修改conf->context.xml文件,在Context节点下配置 <Resource name="jdbc/myDat ...

  4. 调用CXF工具 生成 WSDL【转】

    在做WebService的时候,生成WSDL是必不可少的一步.我们通常使用的工具就是Axis和CXF. CXF提供了一个命令行工具,可以通过命令来生成Java to WSDL,也可以由WSDL生成Ja ...

  5. Show in Finder OC代码

    [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:urls]; /* Activate the Finder, and op ...

  6. jeos没有消亡,但看 debian 的 netinst .iso格式,那就是jeos的系统!

    曾经ubuntu推出专供轻量硬件(如虚拟机)方式的just os格式的.iso [小巧.轻量.快速.干净] 但在 ubuntu 8.04后 再也没有继续 ...... 可惜 不曾想,ubuntu的老爸 ...

  7. jQuery插件实现图片展开效果,jquery.gallery。仿腾讯QQ空间说说图片展示效果。

    公司的项目http://www.umfun.com/,有个说说的页面(和腾讯QQ空间说说一样),里面有个发表图片功能,上传完图片,需要点击展开的效果. 当时手里面事情比较多(公司就我一个前端),忙不过 ...

  8. [转]LINQ之路系列博客导航

    分享一个学习Linq的好博客:Linq之路

  9. Webstorm 11 注册/破解方法

    激活时选择第二个,也就是License server在下面输入框中填http://idea.lanyus.com就行了

  10. WPF国际化(多语言)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...