引言
面向对象类设计,或者说是面向对象设计,有五大原则:
简介
今天我们要接触的是SRP,单一职责原则。
我觉得这些原则的目的就是要实现类的高内聚、低耦合。高内聚high cohision和低耦合low couple在很多时候都是我们的目标,不管我们引入设计模式,进行架构分析、设计、提高复用性,解耦decouple是我们共同的目标。
There should never be more than one reason for a class to change.
类的改变不应该由一个以上的原因导致,也就是说不应该有一个以上的原因可以导致类的改变。
如果类的职责超过一个,这些职责之间就会产生耦合。改变一个职责,可能会影响和妨碍类为其他人服务的功能。这种类型的耦合将会导致脆弱的设计,在修改的时候可能会引入未逾期的问题。
如上图所示,Rectangle类有两个方法:一个是在屏幕上画矩形,一个是计算矩形的面积。两个不同的应用会使用Rectangle类,一个应用使用Rectangle来帮助计算面积,它从来不会在屏幕画矩形。另外一个是图形界面的应用,也可能会计算面积,但是肯定会在屏幕画矩形。
当前的设计就违反了SRP原则,Rectangle类有两个职责,一个是为数学模型提供几何的矩形,计算面积;另外一个职责是为图形用户界面提供矩形的显示。
这个违反SRP原则的设计会导致很多严重的问题。首先,在计算几何应用中必须包含GUI。因为计算几何应用可能就是一个控制台程序,不需要用户界面,但是由于需要使用这个违反SRP原则的类,就必须要包含GUI的类库,在编译的时候要同时编译,在部署的时候还增加了部署的内容,而且这些内容可能永远都不会被用到。
其次,如果图形应用的变化,需要修改Rectangle类的话。我们的计算几何应用也必须要重新编译和部署,因为它也引用了相同的Rectangle类,如果不那么做的话,可能会发生意外的错误(因为Rectangle类被修改了,不知道有没有什么影响)。
好一点的做法是将Rectangle分解为两个类,如下图所示
将计算面积部分从Rectangle类中分离出来,产生一个GeometricRectangle类,专门用来计算面积。这样的话,对于画矩形方法的修改就不会影响到计算几何应用了。也不用在部署多余的内容。
什么是职责?
在上文中,我们将单一职责定义为“一个改变的原因”。如果你想出超过一个改变类的动机,就说明类具有多个职责。这很难以发现。我们习惯于按照组来思考职责。例如,考虑下面的Modem接口。
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->interface IModem
{
public void Dial(string no);
public void Hangup();
public void Send(char c);
public char Reveive();
}
我们中的大多数人认为上面的接口已经设计的不错了,四个功能也都是modem的功能。
但是,这里其实是两个职责。一个职责是连接管理,另外一个是数据通信。Dial和Hangup方法管理moden的链接,Send和Receive管理modem的数据通信。
这两个职责是否应该分开呢?毫无疑问是应该的。这两个职责是没有关系的。他们改变的原因不尽相同。而且,他们会被应用的不同部分调用,这两个部分也会因为不同的原因变化。
上图的做法可能更好,将接口分为两个。然后有一个类来实现这两个接口,代表一个modem。
结论
SRP原则是最简单的原则之一,也是最难做好的原则之一。我们会很自然的将职责连接在一起。找到并且分离这些职责是软件设计需要达到的目的。
分享到:
相关推荐
在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭原则(Open-Closed Principle,简称 OCP)、里氏替换原则(Liskov Substitution Principle,...
1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即一个类只负责一项任务。该原则强调一个类应该只有一个功能点。 2. 开闭原则(Open/Closed Principle, OCP):...
以上介绍的五种面向对象设计原则——单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则和开闭原则,都是面向对象编程领域中非常重要的指导思想。遵循这些原则可以帮助开发者构建出更加健壮、可维护和易于扩展...
C++ 面向对象设计五大原则是面向对象编程(OOP)中一个非常重要的概念,它们是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这五大原则是面向对象设计的基础,遵循这五大原则可以使我们...
【标题】"C#俄罗斯方块源码(单一职责原则)" 涉及到的核心知识点主要是C#编程语言以及软件设计原则中的“单一职责原则”(Single Responsibility Principle, SRP)。C#是一种广泛用于开发Windows应用程序、Web服务和...
1. **单一职责原则(Single Responsibility Principle, SRP)**:每个类或模块应该只有一个引起变化的原因。这意味着一个类应专注于完成一个特定的任务,而不是承担过多的责任。这提高了代码的可读性和可测试性,...
**单一职责原则(Single Responsibility Principle, SRP)**是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)提出,并在《敏捷软件开发:原则、模式和实践》中阐述。这一原则是SOLID原则的首...
LabVIEW 面向对象设计遵循了面向对象编程的五大原则,即 Single Responsibility Principle(单一责任原则)、Open Closed Principle(开闭原则)、Liskov Substitution Principle(里氏替换原则)、Interface ...
三、SRP: The single responsibility principle 单一职责原则 单一职责原则是指每个对象应该只有一个单独的职责,而不是承担多个职责。这样可以提高代码的可维护性和灵活性。 例如,在 Java 中,一个类应该只有一...
前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The Open/Closed Principle(开闭原则OCP) The Liskov ...
### 一、单一职责原则 (SRP, Single Responsibility Principle) #### 定义 单一职责原则主张一个类应该只负责一项职责。这里的“职责”指的是导致类发生变更的原因。如果一个类承担了多项职责,则当需求发生变化时...
面向对象设计的五个基本原则,通常称为SOLID,是五个英文单词的首字母缩写:单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open/Closed Principle, OCP)、里氏替换原则(Liskov Substitution ...
解决这些问题的关键在于深入理解软件需求,合理规划系统架构,并遵循其他面向对象设计原则,如里氏替换原则(Liskov Substitution Principle)、单一职责原则(Single Responsibility Principle)等,以确保系统设计...
在进行面向对象程序设计时,需要遵循SOLID原则,这是五个面向对象设计的基本原则的首字母缩写,包括单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open/Closed Principle, OCP)、里氏替换原则...
1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这意味着每个类都应专注于一项任务。 2. 开放封闭原则(Open-Closed Principle, OCP):类应该对扩展开放,对修改...
- 单一职责原则(Single Responsibility Principle) - 开放封闭原则(Open/Closed Principle) - 里氏替换原则(Liskov Substitution Principle) - 接口隔离原则(Interface Segregation Principle) - 依赖...
SOLID是面向对象设计的五个基本原则的缩写,它们分别是单一职责原则(Single Responsibility Principle)、开放封闭原则(Open-Closed Principle)、里氏替换原则(Liskov Substitution Principle)、接口隔离原则...
- **单一职责原则(Single Responsibility Principle, SRP)**:一个类应该只负责一项职责。 - **开放封闭原则(Open/Closed Principle, OCP)**:软件实体应该是可扩展的,但不可修改的。 - **里氏替换原则(Liskov ...