`

面向对象设计的原则------单一职责原则

阅读更多

      学习设计模式,自然会涉及面向对象的设计原则,面向对象的设计原则一般包括五个原则,下面详细介绍下五个原则:

1、单一职责原则(single responsibility principle )

      There should never be more than one reason for a class to change.

      所谓单一职责原则,就是对一个类而言,应该仅有一个引起它变化的原因。换句话说,一个类的功能要单一,只做与它相关的事情。在类的设计过程中要按职责进行设计,彼此保持正交,互不干涉。

什么是职责?

      在SRP 中,职责定义为“变化的原因”。如果你能够想到多于一个的动机去改变一个类,那么该类就具有多于一个的职责。

为什么要采用单一职责原则?

      因为每一个职责都是变化的一个轴线,当需求变化时,该变化会反映为类的职责的变化。如果一个类承担了多于一个的职责,那么就意味着引起它的变化的原因会有多个。如果一个类承担的职责过多,那么就等同于把这些职责耦合在了一起。一个职责的变化可能会抑制到该类完成其他职责的能力,这样的耦合会导致脆弱的设计。当变化发生时,设计会受到意想不到的破坏。单一职责原则正是实现高内聚低耦合需要遵守的一个原则。

       注意: 单一职责原则简单而直观,但在实际应用中很难实现。只有变化的轴线仅当实际发生时才具有真正的意义。如果没有预兆,那么去应用SRP或者其他任何的原则都是不明智的。

下面就Modem接口为例,说明其原则。

interface Modem {
    public void dial(String pno);   //拨号
    public void hangup();    //挂断
    public void send(char c);   //发送数据
    public char recv();   //接收数据
}

      大多数会认为看起来非常合理,该接口声明的4个函数确实是调制解调器的功能。 然而,该接口中却显示出两个职责。第一个职责连接管理,第二个职责是数据通信。dial和hangup函数进行调制解调器的连接管理,而send和recv负责进行数据通信。这两个职责应该被分开吗?这依赖于应用程序变化的方式。如果应用程序的变化会影响到连接函数的签名,那么这个设计就是僵硬的设计,因为调用send和 recv的类必须重新编译、部署的次数会超过我们预想的情况。在这种情况下,这两个职责必须被分离,我们分别实现这两个职责于:

interface DataChannel
{
    public void send(char c);
    public void recv();
}

interface Connection
{
    public void dial(string pno);
    public void hangup();
}
下面的类图将它的2个不同职责分成2个不同的接口,这样至少可以让客户端应用程序使用具有单一职责的接口:

让ModemImplementation 实现这两个接口。我们注意到,ModemImplementation又组合了2个职责,这不是我们希望的,但有时这又是必须的。通常由于某些原因,迫使我们不得不绑定多个职责到一个类中,但我们至少可以通过接口的分割来分离应用程序关心的概念。事实上,这个例子一个更好的设计应该是这样的,如图:

小结
Single Responsibility Principle (SRP)从职责(改变理由)的侧面上为我们对类(接口)的抽象的颗粒度建立了判断基准,在为系统设计类(接口)的时候应该保证它们的单一职责性。

高内聚、低耦合解释:

      这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低
      首先要知道一个软件是由多个子程序组装而成, 而一个程序由多个模块(方法)构成!

“高内聚,低耦合”主要是阐述的面向对象系统中,各个类需要职责分离的思想。
      每一个类完成特定的独立的功能,这个就是高内聚。耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展。

       类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的,因为在两个对象之间,潜在性地流动了太多信息.低耦合是合乎要求的:它意味着对象彼此之间更独立的工作.低耦合最小化了修改一个类而导致也要修改其它类的"连锁反应". 内聚是一个类中变量与方法连接强度的尺度.高内聚是值得要的,因为它意味着类可以更好地执行一项工作.低内聚是不好的,因为它表明类中的元素之间很少相关.成分之间相互有关联的模块是合乎要求的.每个方法也应该高内聚.大多数的方法只执行一个功能.不要在方法中添加'额外'的指令,这样会导致方法执行更多的函数。
      推广开来说,这个思想并不限于类与类之间的关系。模块和模块,子系统之间也都要遵守这个原则,才可以设计出延展性比较强的系统。

 

 

分享到:
评论
1 楼 zjc198805 2013-05-24  
低耦合最小化了修改一个类而导致也要修改其它类的"连锁反应"  这句话没看懂,按照之前的理解,低耦合修改了一个类,不应该影响其他的类!

相关推荐

    Ruby 面向对象设计实践--2013年

    - **单一职责原则**(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。 - **开放封闭原则**(Open/Closed Principle, OCP):软件实体应该是对扩展开放的,对修改封闭的。 - **里氏...

    面向对象设计原则.ppt

    1. **单一职责原则(SRP)**:一个类应该只有一个引起它变化的原因。这意味着每个类应专注于一项任务,避免将多个职责混杂在一起。在员工工资计算的例子中,`Employee`类只负责提供薪金计算的接口,具体的计算逻辑则...

    23种 设计模式---面向对象的基本原则

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这意味着一个类应该只做一件事情,这样可以提高代码的可维护性和可读性。 2. 开放封闭原则(Open-Closed ...

    Java_面向对象设计原则总结

    4 单一职责原则-Single Responsibility Principle (SRP) 5 开闭原则-The Open-Closed Principle (OCP)   二 包的设计原则 6 重用发布等价原则-Release Reuse Equivalency Principle (REP) 7 无环依赖...

    面向对象设计原则.pdf

    ### 面向对象设计原则详解 面向对象设计原则是一系列指导软件开发人员构建高质量、易于维护和扩展的软件系统的准则。这些原则旨在帮助开发者创建更健壮、更灵活的系统,减少代码间的耦合度,并提高代码的重用性和...

    面向对象设计原则(SRP,OCP,LSP,DIP,ISP)

    面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP

    程序员必备的七大面向对象设计原则

    面向对象设计原则总结 面向对象设计原则是软件设计中最重要的原则之一,它们是软件设计的基础和核心。面向对象设计原则的应用可以提高软件的开发效率、质量和可维护性。下面是七大面向对象设计原则的总结: 一、开...

    C++设计模式课件2_面向对象设计原则.pdf

    3. **单一职责原则(Single Responsibility Principle, SRP)** - **原则阐述**:一个类应该只有一个改变的原因。 - **实践意义**:通过将类的功能细化到单一职责,降低类的复杂度,提高代码的可读性和可维护性。 ...

    面向对象程序设计--实验报告模板[最新]2

    - 反思实验中对面向对象原则的理解和应用,如单一职责原则、开放封闭原则等。 5. 实验源码和源码地址: - 提供完整的源代码,包括各个类的定义、对象的实例化和方法调用。 - 将源码托管在GitHub或其他代码仓库,...

    面向对象设计原则英文文章

    首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...

    面向对象程序设计--实验报告模板[最新]1

    - 讨论面向对象设计原则,如单一职责原则、开放封闭原则、里氏替换原则等在实验中的体现。 - 总结实验成果,评估代码的可读性、可维护性和扩展性。 5. 实验源码和源码地址: - 在完成实验后,应将源代码托管到像...

    面向对象设计原则解析

    1. **单一职责原则(Single Responsibility Principle, SRP)** 这一原则规定,一个类应该只有一个引起其变化的原因。换句话说,每个类应专注于完成一个特定的职责或功能,避免职责混杂。这样可以提高代码的稳定性...

    面向对象设计原则

    面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

    面向对象原则.zip

    1面向对象6大原则--单一职责原则 2面向对象6大原则--里氏代换原则 3面向对象6大原则--开闭原则 4面向对象6大原则--依赖倒转原则 5面向对象6大原则--合成复用原则 6面向对象6大原则--接口隔离原则

    java面向对象设计的六大原则

    以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...

    面向对象设计原则PPT

    面向对象设计原则概述 单一职责 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

    面向对象思想----不看后悔!

    1. **单一职责原则**(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因。 2. **开放封闭原则**(Open/Closed Principle,OCP):软件实体应该是可扩展的,但不可修改。 3. **里氏替换...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则

    1. 单一职责原则(SRP):一个类或模块应只有一个改变的原因。这有助于保持代码的模块化,降低耦合度。 2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应对扩展开放,对修改关闭。这意味着我们可以添加新的...

Global site tag (gtag.js) - Google Analytics