在传统的代码库中,我们常常会看到一些违反了SRP原则的类。这些类通常以Utils或Manager结尾,有时也没有这么明显的特征而仅仅是普通的包含多个功能的类。这种God类还有一个特征,使用语句或注释将代码分隔为多个不同角色的分组,而这些角色正是这一个类所扮演的。 
久而久之,这些类成为了那些没有时间放置到恰当类中的方法的垃圾桶。这时的重构需要将方法分解成多个负责单一职责的类。
public class CustomerService {
public Double CalculateOrderDiscount(List<Product> products, Customer customer) {
// do work
}
public Boolean CustomerIsValid(Customer customer, Order order) {
// do work
}
public List<String> GatherOrderErrors(List<Product> products, Customer customer) {
// do work
}
public void Register(Customer customer) {
// do work
}
public void ForgotPassword(Customer customer) {
// do work
}
}
使用该重构是非常简单明了的,只需把相关方法提取出来并放置到负责相应职责的类中即可。这使得类的粒度更细、职责更分明、日后的维护更方便。上例的代码最终被分解为两个类:
public class CustomerOrderService {
public Double CalculateOrderDiscount(List<Product> products, Customer customer) {
// do work
}
public Boolean CustomerIsValid(Customer customer, Order order) {
// do work
}
public List<String> GatherOrderErrors(List<Product> products, Customer customer) {
// do work
}
}

public class CustomerRegistrationService {
public void Register(Customer customer) {
// do work
}
public void ForgotPassword(Customer customer) {
// do work
}
}



最新文章

  1. asp.net LINQ连接数据库SQL执行数据的增加、修改、删除、查询操作
  2. java反射案例
  3. Android开发学习笔记--给一个按钮定义事件
  4. 绿色通道(codevs 3342)
  5. servlet1
  6. SQL基础分类
  7. NSArray,NSSet,NSDictionary的遍历,基本使用集锦
  8. Android IOS WebRTC 音视频开发总结(十六)-- 音频设备操作之opensl与jni
  9. 正则转nfa:完成
  10. WCF之消息模式
  11. Remark of BLENDFUNCTION from MSDN
  12. 【转】Hibernate和ibatis的比较
  13. BZOJ3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者
  14. How many prime numbers(求素数个数)
  15. openwrt驱动与应用程序的联系
  16. XMPP系列(四)---发送和接收文字消息,获取历史消息功能
  17. vue组件,可以通过npm引用的组件
  18. vue 自学笔记(6) axios的使用
  19. java注解和反射学习
  20. unity3d Player Settings 中的Stripping Level(剥离等级)对应每个等级具体剥离了哪些库

热门文章

  1. Codechef Racing Horses题解
  2. Objective-C语言的 if ( self = [super init] )
  3. 万一的Delphi消息教程
  4. HDU1052Tian Ji -- The Horse Racing
  5. 关于Doctype、严格模式与混杂模式
  6. 【CEOI2002】【Poj 1038】Bugs Integrated, Inc.
  7. android判断正在使用的网络类型 0.不知道网络类型;1、2G;2、3G;3、4g;4、wifi
  8. 【146】ArcObjects类库索引
  9. java笔记线程电影院卖票最终版
  10. 一句powershell调用mimikatz抓密码