前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式—–单一职责原则

设计模式—–单一职责原则

作者头像
对弈
发布2019-11-07 17:14:39
5870
发布2019-11-07 17:14:39
举报

单一职责原则

定义

单一职责原则(Single Responsibility Principle, SRP)是Bob大叔提倡的S.O.L.I.D五大设计原则中的第一个。其中,职责(Responsibility)被表述为“变化的原因”(reason to change);SRP被表述为“一个类应该有且只有一个变化的原因”。但如果光从字面去理解,SRP很容易让人望文生义产生误解。本文希望能阐明SRP的本质,达到避免误解和指导设计的目的。

动机

**对于设计原则的理解应该首先从它的动机入手,即遵循这个原则带来的好处是什么?对于SRP来讲,如果遵循“一个类应该有且只有一个变化的原因”是因,那么“任何一个变化只会影响一个类”就是果。可见SRP的动机主要是系统的可维护性,即降低适应变化的成本。 **

多功能与单变化

**对于单功能的类来讲,比较容易遵循SRP,比如:把string转换为DateTime类型的工具类。理解SRP的难点在于在多功能类的情形,即不容易理解多功能与单变化的矛盾。让我们先来看一个Modem类的例子,Modem具有4个功能:拨号,挂断,发送数据,接收数据: **

代码语言:javascript
复制
class Modem {

    public void Dial(string aPno) {…}

    public void Hangup() {…}

    public void Send(char aData) {…}

    public char Receive() {…}

}

**我们先来考察一下Modem类的变化点,并将其分为两类:1.Modem类的内部细节变化,比如Dial、Hangup、Send、Receive等具体实现发生了变化;2.Modem类整体性的变化,比如Modem类需要增加Poweron和Poweroff方法。上面的Modem类具有多个变化点,不符合SRP。 **

抽象与抽象层次

**我们先来考察一下Modem类的变化点,并将其分为两类:1.Modem类的内部细节变化,比如Dial、Hangup、Send、Receive等具体实现发生了变化;2.Modem类整体性的变化,比如Modem类需要增加Poweron和Poweroff方法。上面的Modem类具有多个变化点,不符合SRP。 **

代码语言:javascript
复制
interface IDialable{

    void Dial(string aPno);

}

class Dialer : IDialable{

    public void Dial(string aPno){…}

}



class Modem{

    public void Dial(string aPno) { m_dialer.Dial(aPno); }

    private IDialable m_dialer;



    … //hangup, send, receive类似

}

**上面的设计将各个功能点抽象为单一的接口,将变化封装在稳定的接口背后,再通过组合的方式建立起整体的Modem类与局部的功能点的联系。这样就避免了低层的变化传导到高层。 **

总结

可见,理解SRP的关键在于理解类的抽象层次,高层次的类是高层概念的抽象,低层次的类是低层概念的抽象。低层的变化只影响低层类,高层的变化只影响高层类。对于遵守SRP的设计,一定具有很好的抽象层次,因此不妨以SRP为指导和检验,帮助我们设计出好的类来。最后,我用几个关键词梳理SRP的脉络:

类只有一个变化的原因 >> 一个变化只影响一个类 >> 变化只影响其相应层次的类

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f-%e5%8d%95%e4%b8%80%e8%81%8c%e8%b4%a3%e5%8e%9f%e5%88%99/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单一职责原则
    • 定义
      • 动机
        • 多功能与单变化
          • 抽象与抽象层次
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档