六大设计原则之单一职责原则(SRG)

在做代码练习或者开发的过程中,我们会发现自己写的类越来越大,该类的功能也越来越多。有一些开发者包括之前的我看到自己写的类够大,功能够多是往往会充满自豪感。但是当某个功能需要做一个小改动时,就会发现整个程序出现了各种大大小小的问题。

为什么知识对这个类的一个功能做了小小的修改就会引起这么大的问题?因为我们违反了单一职责原则。将多种功能集成在一个类中,就等于把这些功能耦合了起来,一个功能的变化可能会削弱或者抑制这个类完成其他职责的能力。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

1. 解说定义

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

在一个类中,可以导致类变更的因素最多只能有一个。何为类变更呢?当你要改变该类中某些代码时,该类的某些用途或特性会随着改变。
但是无论你怎么改,这个类只有最多一个用途或特性改变了,而不会再有其他的改变。只有这样一个类的改变对其他使用到该类的模块影响才会达到最低。也只有一个类只实现一个功能时才能做到到这种最小的改变。

2. 问题由来

类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

3. 解决办法

遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。

4.职责扩散

很多程序员都清楚自己编程时要遵循单一职责原则,但总是在不经意间违反了这个原则。因为某种原因,某一职责需要分化为粒度更细的多个职责了,这就是职责扩散

5.例子

public interface ICar { 
    //品牌
    void setPinPai(String pinpai);
    void getPinPai();
    //颜色
    void setColor(String color);
    void getColor();
    //启动
    boolean Start(boolean start);
    //停车
    boolean Stop(boolean stop);
}
}

从上面例子中,我们不知道这个接口的具体职责是什么,有点模糊不清。车子的品牌和颜色是车子的属性,而启动和停车是车子的行为,将车子的属性和行为耦合到一个接口中,给人一种结构职责不清的感觉,对后期的维护带来一定的麻烦。

为了解决这个问题,应当使用单一职责原则,将车子接口中的业务对象(属性)和业务逻辑(行为)解耦,分成两个接口,如下:

/**
 * BO:Bussiness Object,业务对象  
 * 负责车子的属性  
 * @author 叶汉伟
 */
public interface ICarBO {
    //品牌
        void setPinPai(String pinpai);
        void getPinPai();
        //颜色
        void setColor(String color);
        void getColor();
}
/**  
 * BL:Business Logic,业务逻辑  
 * 负责车子的行为  
 * @author 叶汉伟
 */ 
public interface ICarBL {
    //启动
    boolean Start(boolean start);
    //停车
    boolean Stop(boolean stop);
}

这样就实现了接口的单一职责原则。他们各自有一个实现类CarBO、CarBL。当需要修改车子属性的时候只需要对CarBO这个接口来修改,只会影响到CarBO这个类,不会影响其他类。

6. 优点

  1. 可以使得类的逻辑变得简单,功能清晰。每个类只负责一个职责,那么这个类的功能是非常清晰的,相比于有多个职责的类,单一职责的类的逻辑会更简单。
  2. 程序的可读性和可维护性相对较强。
  3. 降低变更引起的风险,对系统扩展性和维护性很有帮助。

但是,单一职责原则有时候会给我们带来一些麻烦。如果职责太多的话,每个职责一个类,会造成类的数量过多,反而降低了代码的可读性和程序的可维护性。所以使用这个职责的时候还要具体情况具体分析。建议就是接口一定要采用单一职责原则,实现类的设计上尽可能做到单一职责原则,最好是一个原因引起一个类的变化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 要走, 就没有停留的理由。 忘记家乡的山川与河流, 跟朋友们醉生梦死的酒。 心里眼里却长满了所谓的愁, 在离开的路...
    大狗少一阅读 366评论 0 2
  • 人可以不认字,但不可以不识人。树高万丈不忘根,人若辉煌莫忘恩!这辈子,永远要记得感谢三种人:一,能跟你同甘共苦的人...
    李明信阅读 861评论 0 1