编码最佳实践——单一职责原则

 SOLID是一组最佳编码实践的首字母缩写

  • S 单一职责原则
  • O 开放与封闭原则
  • L Liskov(里式)替换原则
  • I 接口分离原则
  • D 依赖注入原则

同时应用这些最佳实践,可以提升代码适应变更的能力。但是凡事要有度,过度使用虽然可以让代码有很高的自适应能力,但是会导致层次粒度过小而难以理解或使用,还会影响代码的可读性。

mark

单一职责原则

单一职责原则(Single Responsibility principle)要求开发人员编写的代码有且只有一个变更理由。如果一个类有多个变更理由,那么它就具有多个职责。这个时候就要进行重构,将多职责类拆解为多个单职责类。通过委托和抽象,包含多个变更理由的类应该把一个或多个职责委托给其他的单职责类

之前看过一篇文章,讲为什么面向对象比面向过程更能适应业务变化?从其中也可以看出单一职责原则带来的好处,职责明确,只需要修改局部,不会对外部造成影响,影响可以控制在足以掌控的范围内。

对象将需求用类一个个隔开,就像用储物箱把东西一个个封装起来一样,需求变了,分几种情况,最严重的是大变,那么每个储物箱都要打开改,这种方法就不见得有好处;但是这种情况发生概率比较小,大部分需求变化都是局限在一两个储物箱中,那么我们只要打开这两个储物箱修改就可以,不会影响其他储物柜了。

而面向过程是把所有东西都放在一个大储物箱中,修改某个部分以后,会引起其他部分不稳定,一个BUG修复,引发新的无数BUG,最后程序员陷入焦头烂额。

我们一段代码为例,通过重构的过程,体会一下单一职责原则的好处。

面向过程编码

public class TradeRecord {     public int TradeAmount { get; set; }      public decimal TradePrice { get; set; } }
public class TradeProcessor {     public void ProcessTrades(Stream stream)     {         var lines = new List<string>();          using (var reader = new StreamReader(stream))         {             string line;             while((line =reader.ReadLine()) != null)             {                 lines.Add(line);             }         }          var trades = new List<TradeRecord>();         var lineCount = 1;         foreach (var line in lines)             {                 var fields = line.Split(new char[] { ',' });                  if(fields.Length != 3 )                 {                     Console.WriteLine("WARN: Line {0} malformed. Only {1} fields found",lineCount, fields.Length);                 }                  int tradeAmount;                 if (!int.TryParse(fields[0], out tradeAmount))                 {                     Console.WriteLine("WARN: Trade amount on line {0} not a valid integer :{1}",lineCount, fields[0]);                 }                  decimal tradePrice;                 if (!decimal.TryParse(fields[1], out tradePrice))                 {                     Console.WriteLine("WARN: Trade Price on line {0} not a valid decimal :{1}", lineCount, fields[1]);                 }                  var tradeRecord = new TradeRecord                 {                     TradeAmount = tradeAmount,                     TradePrice = tradePrice                 };                 trades.Add(tradeRecord);                 lineCount++;             }                  using (var connection = new SqlConnection("DataSource=(local);Initial Catalog=TradeDataBase;Integrated Security = True;"))                 {                     connection.Open();                     
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信