软件设计模式原则(三)单一职责原则

单一职责原则(SRP)又称单一功能原则。它规定一个类应该只有一个发生变化的原因 。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

目录

一.定义

二.原理

类的单一职责原则

单一职责原则好处

三.实践



一.定义

每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起------这会导致脆弱的设计 。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。

二.原理

如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计 ,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性

类的单一职责原则

一般一个对象可以分为属性行为 二部分,所以在类的设计时,我们一般把对象的属性抽象成一个BO(Business Object,业务对象) ,把对象的行为抽象成一个Biz(Business Logic,业务逻辑)

单一职责原则好处
  • 降低类的复杂性:每个类实现单一职责,并且单一职责都有清楚明确的定义,复杂性当然降低
  • 提高可读性:类的复杂性降低了,当然提高了可读性了。
  • 提高可维护性:类的复杂性降低,可读性好,当然好维护。
  • 提高扩展性:变更引起的风险降低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只对相应的实现类有影响,对其它的接口没有影响,这对系统的扩展性,维护性都是有好处的。

归纳弱点:

  • 职责多,引起此类变化的原因也多。后续变更的风险就大。
  • 后续需求变更,会造成职责的混乱,类结构的不稳定。

三.实践

举个例子,将一个女孩追到手,有如下两种方式:

方法一

java 复制代码
public void ChaseGirl()
{
	SentLetter();
	DevelopFeeling();
	MakeVow();
}

public void SentLetter()
{
	
}

public void DevelopFeeling()
{
	
}

public void MakeVow()
{
	
}

方法二

java 复制代码
public void ChaseGirl()
{
	SentLetterAndDevelopFeeling();
	MakeVow();
}

public void SentLetterAndDevelopFeeling()
{
	
}

public void MakeVow()
{
	
}

不难看出,虽然底层的实现逻辑几乎相同,但是方法二中将送情书and发展感情耦合在了一个类中,违反了单一原则:假设有的女孩对情书不屑一顾,那么就要修改认识的方式------但此时也要修改发展感情的方法~这就是典型的耦合性高的开发~

单一职责原则的重心不在于"一",而是如何拆分"一":每个设计师都知道软件应该解耦和分层,但难的是何时分,以及如何分------比如有的人就认为建立契机和发展感情应该是一个统一的过程~

因此引出解决的方法:遵守单一职责原则,将不同的职责封装到不同的类或模块中。

类改造:改造后,类的职责单一

原有违背单一职责原则的类如下:

修改后如下:

这种清晰的职责范围划分就是单一职责原则的最佳实践。符合单一职责原则的设计能使类具备高内聚性,让单个模块变得简单易懂,如此才能增强代码的可读性和可复用性。并提高系统的易维护性和易测试性。

相关推荐
星图易码1 天前
软件工程的范式演进:深度解构低代码(Low-Code)的技术逻辑与未来图景
低代码·软件工程
赛希咨询1 天前
生成式人工智能问答:在软件工程中的应用
人工智能·软件工程
caoxiaoye1 天前
SDD规范驱动开发新范式:软件工程的未来变革与落地实践
驱动开发·软件工程
三方测试小学徒2 天前
GB/T 38634.3-2020《系统与软件工程 软件测试 第3部分:测试文档》之整体解读
软件工程·cma·cnas·38634
张较瘦_2 天前
[论文阅读] AI + 软件工程 | 突破AAA游戏测试瓶颈!选择性插桩让代码覆盖“轻装上阵”
论文阅读·游戏·软件工程
XuanTao773 天前
【安卓工具实测】影视仓更新!!追剧党狂喜!影视仓无广告版太香了!
深度学习·数码相机·智能手机·软件工程·软件构建
三方测试小学徒3 天前
GB/T 38634.2-2020《系统与软件工程 软件测试 第2部分:测试过程》之整体解读
软件工程·cma·cnas·38634
浩子智控3 天前
不同RPA实现技术的比较
软件工程·rpa
搞科研的小刘选手4 天前
【数字经济专题会议】第三届粤港澳大湾区数字经济与人工智能国际学术会议(DEAI 2026)
人工智能·aigc·软件工程·电子商务·数字经济·经济学·学术会议
张彦峰ZYF4 天前
从概念拆解到架构现实的系统性认知低代码平台
低代码·架构·软件工程·概念拆解到架构现实的系统性认知·低代码并非单一技术·应用交付工程范式·建模与可视化工程能力