zoukankan      html  css  js  c++  java
  • 重构第27天 去除上帝类(Remove God Classes)

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

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

     1  public class CustomerService
     2     {
     3         public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
     4         {
     5             // do work
     6         }
     7 
     8         public bool CustomerIsValid(Customer customer, Order order)
     9         {
    10             // do work
    11         }
    12 
    13         public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
    14         {
    15             // do work
    16         }
    17 
    18         public void Register(Customer customer)
    19         {
    20             // do work
    21         }
    22 
    23         public void ForgotPassword(Customer customer)
    24         {
    25             // do work
    26         }
    27     }

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

     1  public class CustomerOrderService
     2     {
     3         public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
     4         {
     5             // do work
     6         }
     7 
     8         public bool CustomerIsValid(Customer customer, Order order)
     9         {
    10             // do work
    11         }
    12 
    13         public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
    14         {
    15             // do work
    16         }
    17     }
    18 
    19     public class CustomerRegistrationService
    20     {
    21 
    22         public void Register(Customer customer)
    23         {
    24             // do work
    25         }
    26 
    27         public void ForgotPassword(Customer customer)
    28         {
    29             // do work
    30         }
    31     }

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

  • 相关阅读:
    MySQL 序列使用
    04_使用httpclient提交参数_get提交参数
    03_使用httpurlconnection提交参数_get中文参数解决&post提交
    01_今日内容
    00_消息机制回顾
    20_内容回顾
    19_MySmartImageView添加展示默认图的功能
    18_MySmartImageView实现
    17_自定义View对象构造说明
    16_新闻客户端_展示图片内容完成
  • 原文地址:https://www.cnblogs.com/yplong/p/5381398.html
Copyright © 2011-2022 走看看