单一职责原则
这个原则描述了内聚性:一个模块组成元素的功能相关性。单一职责原则描述了引起类变化的原则只有一个,而职责就是变化的原因,如果你能够想到多于一个动机去改变类,那么这个类就具有多于一个职责。
例如
class Rectangle{
public void draw();
public double area();
}
如果这个类为两个不同的应用程序所使用:计算几何学方面的,它只需要提供计算面积的方法,图形绘制方面的,它可能只需要在屏幕上绘制自己。那么这个类就有了两个职责,这种设计违反了单一职责原则。当我们在计算几何学方面方面需要新的功能时我们需要修改这个类,
当在图形绘制方面修改这个类时也需要修改这个类。
这样我们可以把这个Rectangle分成两个:
class GeometricRantangle{
public double area();
}
class GUIRectangle(){
public void draw();
}
这样当我们需要在计算几何学方面使用Rantangle时,我们直接使用GeometricRantangle,图形绘制方面直接使用GUIRectangle。
再看一个调制解调器的例子:
interface Moderm{
public void dial(String pno);
public void hangup();
public void send(char c);
public void recv();
}
多数人会认为这个接口是合理的,但这个接口却承担了两个职责:一是连接管理;二是数据通信。而在大多数应用中,连接管理和数据通信往往是分开的。如果无论连接管理发生了变化还是数据通信发生了变化,我们都需要修改这个类,这就造成了编译和部署的次数会超过我们希望的次数,这个设计具有僵化的Bad Smell.这种情况下我们希望把这两个职责分离:
interface Connection{
public void dial(String pno);
public void hangup();
}
interface Channel{
public void send(char c);
public void recv();
}
class Moderm implements Connection,Channel{
//...
}
虽然我们看到Moderm依然是一个杂凑物,似乎也有两个职责,但这是必须的,因为这是对Moderm 功能真实的抽象。但是,这样我们需要连接管理的时候,我们只依赖于Connection接口,当我们需要数据通信的时候只需要依赖Channel接口,谁都不需要依赖具体的Moderm.单一职责通常是针对提供给用户接口来说的,而实际类作为一个实际的对用物,有
多种职责可能是必须的,只要我们抽象出单一职责的接口,让其他的代码只依赖于这些接口就行了。
我们在企业级开发时经常遇到的情况是,在业务层写持久化规则,业务规则是经常变化的,而持久化规则通常是稳定的。如果不把他们分离,每次变化我们都要编译部署整个混合体,这只能是自找苦吃。通常的做法是使用DAO模式,分离出数据访问层,让业务层依赖于DAO接口,这样业务层发生变化时,不会影响 数据访问层,并且可以随时替换掉数据访问层的具体实现。
当然如果应用程序的变化总会导致这两种职责的同时变化,那么就不必分离他们,毕竟单一职责原则会带来一些复杂性,生成更多的接口。如果过度使用这个原则会造成过度设计的Bad Smell.
分享到:
相关推荐
6.恰恰是告诉我们用抽象构建框架,用实现扩展细节的注意事项而已:单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计...
●面向对象设计原则:本书包含了11个面向对象设计原则,涵盖了包的设计和类的设计。这是我所见过的对这方面内容讲解的最清晰、最彻底、最深刻的唯一的一本书。 ●设计模式:本书中讲述了23个设计模式,并都有...
面向对象语言及系统 19 第二节 面向对象的分析 20 OOA分析的任务 20 OOA分析的原则 20 OOA分析过程 20 第三节 面向对象的设计 20 设计的模型 20 设计的三条重要原则 21 面向对象设计的概念 21 面向对象的设计方法 21...
此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。 本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业...
1. 针对特定平台(编程语言、操作系统、数据库、框架、 2. 应用面向对象设计的原则与模式进行优化 1. 单一职责原则SRP 2. 里氏替换原则LSP 3. 依
不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 本书是为那些熟悉.NET框架但希望了解如何改进编码方式以及如何运用设计模式、设计原则和最佳实践来提高代码的可维护性和适应性的ASP.NET开发者而写...
2.2 框架设计的基本原则 10 2.2.1 场景驱动设计的原则 11 2.2.2 低门槛原则 17 2.2.3 自说明对象模型原则 20 2.2.4 分层架构原则 25 2.3 小结 27 第3章 命名规范 28 3.1 大小写约定 29 3.1.1 ...
本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...
不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 《asp.net设计模式》是为那些熟悉.net框架但希望了解如何改进编码方式以及如何运用设计模式、设计原则和最佳实践来提高代码的可维护性和适应性的...
《Cocoa设计模式》介绍了Cocoa框架中用到的面向对象的设计模式。Cocoa框架是Apple的面向对象开发环境,用来开发:Mac OS X的应用程序。主要的开发语言为Objective-C,它是Mac下进行开发必不可少的开发环境。 《Cocoa...
Java基础知识:包括Java语言的特性、面向对象编程、异常处理、集合框架、多线程等。确保你对Java核心概念和相关的API有很好的理解。 数据结构和算法:了解常见的数据结构(如数组、链表、栈、队列、树、图等)以及...
一方面,设计模式教我们如何使用面向对象设计的原则解决各种问题; 另一方面,设计模式定义了一种通用语言(跟框架一样,统一一个标准),让大家在做系统设计的时候,能更有效的交流。 我们学习设计模块的核心...
GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...
这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。 第1章 概述 1 1.1 精心设计的框架所具备的品质 2 1.1.1 精心...
java8集合源码关于设计原则、编程语言、工具和框架的说明 设计原则 面向对象编程 在本节中,我们将描述涉及面向对象编程 (OOP) 的关键概念,以及为什么现代系统正在慢慢采用替代技术来替代以前作为理想 OOP 模式教导...
书中不仅讲述面向对象语言(Java、C#和C++)代码,也有专章讨论C这样的过程式语言。作者将理解、测试和修改代码的原理、技术和最新工具(自动化重构工具、单元测试框架、仿对象、集成测试框架等),与解依赖技术和...
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架, 遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持...