博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重构第27天 去除上帝类(Remove God Classes)
阅读量:6600 次
发布时间:2019-06-24

本文共 1988 字,大约阅读时间需要 6 分钟。

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

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

 

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

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

1  public class CustomerOrderService 2     { 3         public decimal CalculateOrderDiscount(IEnumerable
products, Customer customer) 4 { 5 // do work 6 } 7 8 public bool CustomerIsValid(Customer customer, Order order) 9 {10 // do work11 }12 13 public IEnumerable
GatherOrderErrors(IEnumerable
products, Customer customer)14 {15 // do work16 }17 }18 19 public class CustomerRegistrationService20 {21 22 public void Register(Customer customer)23 {24 // do work25 }26 27 public void ForgotPassword(Customer customer)28 {29 // do work30 }31 }

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

 

转载地址:http://ekmio.baihongyu.com/

你可能感兴趣的文章
中断体验:观察自定义中断的安装及触发
查看>>
格式化、挂载、手动增加swap
查看>>
linux 远程gui管理 webmin
查看>>
CUDA学习(八十七)
查看>>
VR产业转移线下发力 移动VR体验馆落户北京国美
查看>>
mysql回收用户权限
查看>>
Android之Adapter用法总结
查看>>
设计模式之观察者模式在Listview中的应用
查看>>
Centos6.5 nodejs6.6 yum源安装
查看>>
Windows server 2012安装.NET 3.5
查看>>
使用C#的WebService实现客户端软件的更新
查看>>
GDB高级技巧
查看>>
shell基础:使用read、命令行脚本传参实现输入2个整数并计算
查看>>
事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)
查看>>
【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式;
查看>>
SCOM监控端口
查看>>
SHELL——通配符,IO重定向,正则表达式
查看>>
如何查看已委派控制的用户及具体权限
查看>>
Kotlin从入门到放弃(四)——协程下
查看>>
You should be here !
查看>>