理解:面向对象的五大特征: SOLID,其中S就是职责单一原则。分离职责指当一个类有许多职责时,将部分职责分离到独立的类中,这样也符合面向对象的五大特征之一的单一职责原则,同时也可以使代码的结构更加清晰,维护性更高。
详解:依然看下面的例子。
befor reflector
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace ReflectorDemo 8 { 9 public class Video 10 { 11 public void PayFee(decimal fee) 12 { 13 14 } 15 16 public void RentVideo(Video video, Customer customer) 17 { 18 customer.Videos.Add(video); 19 } 20 21 public decimal CalculateBalance(Customer customer) 22 { 23 return customer.LateFees.Sum(); 24 } 25 } 26 27 public class Customer 28 { 29 public IList<decimal> LateFees { get; set; } 30 31 public IList<Video> Videos { get; set; } 32 33 } 34 }
可以看到,Video类有2个职责,一个是用来处理video出租的,一个是用来处理客户租金费用的。我们可以把跟客户计算租金的职责分离出来,方法Customer类中去,更符合场景。
after reflected
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace ReflectorDemo 8 { 9 public class Video 10 { 11 12 13 public void RentVideo(Video video, Customer customer) 14 { 15 customer.Videos.Add(video); 16 } 17 18 } 19 20 public class Customer 21 { 22 public IList<decimal> LateFees { get; set; } 23 24 public IList<Video> Videos { get; set; } 25 26 public void PayFee(decimal fee) 27 { 28 29 } 30 31 32 public decimal CalculateBalance(Customer customer) 33 { 34 return customer.LateFees.Sum(); 35 } 36 } 37 }
这个重构经常会用到,它和之前的“移动方法”有几分相似之处,让方法放在合适的类中,并且简化类的职责,同时这也是面向对象五大原则之一和设计模式中的重要思想。