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     }

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

  • 相关阅读:
    一百零二、SAP中ALV事件之十五,让ALV表格自动求和
    一百零一、SAP中ALV事件之十四,让ALV表格自动排序
    一百、SAP中ALV事件之十三,给ALV的自定义按钮添加事件
    九十九、SAP中ALV事件之十二,给ALV的标题栏添加图片
    九十八、SAP中ALV事件之十一,查看图片
    九十七、SAP中ALV事件之十,通过REUSE_ALV_COMMENTARY_WRITE函数来显示ALV的标题
    九十六、SAP中ALV事件之九,显示功能按钮栏中显示ALV加强工具栏
    九十五、SAP中查看自定义包的所有模块,对象,函数主,事务等
    二十、JavaScript之对象
    十九、JavaScript之数组
  • 原文地址:https://www.cnblogs.com/yplong/p/5381398.html
Copyright © 2011-2022 走看看