`

面向对象的原则、模式、语言及框架(三)

阅读更多
单一职责原则
这个原则描述了内聚性:一个模块组成元素的功能相关性。单一职责原则描述了引起类变化的原则只有一个,而职责就是变化的原因,如果你能够想到多于一个动机去改变类,那么这个类就具有多于一个职责。
例如
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.
3
1
分享到:
评论
1 楼 healer_kx 2008-07-14  
你翻译的?

相关推荐

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    6.恰恰是告诉我们用抽象构建框架,用实现扩展细节的注意事项而已:单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计...

    敏捷软件开发:原则、模式与实践.pdf

     ●面向对象设计原则:本书包含了11个面向对象设计原则,涵盖了包的设计和类的设计。这是我所见过的对这方面内容讲解的最清晰、最彻底、最深刻的唯一的一本书。  ●设计模式:本书中讲述了23个设计模式,并都有...

    面向对象与UML资料

    面向对象语言及系统 19 第二节 面向对象的分析 20 OOA分析的任务 20 OOA分析的原则 20 OOA分析过程 20 第三节 面向对象的设计 20 设计的模型 20 设计的三条重要原则 21 面向对象设计的概念 21 面向对象的设计方法 21...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。  本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业...

    06_面向对象设计1

    1. 针对特定平台(编程语言、操作系统、数据库、框架、 2. 应用面向对象设计的原则与模式进行优化 1. 单一职责原则SRP 2. 里氏替换原则LSP 3. 依

    asp.net 设计模式样章试读

    不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 本书是为那些熟悉.NET框架但希望了解如何改进编码方式以及如何运用设计模式、设计原则和最佳实践来提高代码的可维护性和适应性的ASP.NET开发者而写...

    NET设计规范-.NET约定、惯用法与模式.part2

    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 ...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    ASP.NET设计模式-杨明军译(源码)

    不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。  《asp.net设计模式》是为那些熟悉.net框架但希望了解如何改进编码方式以及如何运用设计模式、设计原则和最佳实践来提高代码的可维护性和适应性的...

    Cocoa Design Patterns

    《Cocoa设计模式》介绍了Cocoa框架中用到的面向对象的设计模式。Cocoa框架是Apple的面向对象开发环境,用来开发:Mac OS X的应用程序。主要的开发语言为Objective-C,它是Mac下进行开发必不可少的开发环境。 《Cocoa...

    Java面试宝典和毕设PPT模板

    Java基础知识:包括Java语言的特性、面向对象编程、异常处理、集合框架、多线程等。确保你对Java核心概念和相关的API有很好的理解。 数据结构和算法:了解常见的数据结构(如数组、链表、栈、队列、树、图等)以及...

    论设计模式的重要性-《重学设计模式》

    一方面,设计模式教我们如何使用面向对象设计的原则解决各种问题; 另一方面,设计模式定义了一种通用语言(跟框架一样,统一一个标准),让大家在做系统设计的时候,能更有效的交流。 我们学习设计模块的核心...

    二十三种设计模式【PDF版】

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

    NET设计规范-.NET约定、惯用法与模式.part1

    这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。 第1章 概述 1 1.1 精心设计的框架所具备的品质 2 1.1.1 精心...

    java8集合源码-orgfiles-computing:关于设计原则、编程语言、工具和框架的说明

    java8集合源码关于设计原则、编程语言、工具和框架的说明 设计原则 面向对象编程 在本节中,我们将描述涉及面向对象编程 (OOP) 的关键概念,以及为什么现代系统正在慢慢采用替代技术来替代以前作为理想 OOP 模式教导...

    修改代码的艺术2014版

    书中不仅讲述面向对象语言(Java、C#和C++)代码,也有专章讨论C这样的过程式语言。作者将理解、测试和修改代码的原理、技术和最新工具(自动化重构工具、单元测试框架、仿对象、集成测试框架等),与解依赖技术和...

    ThinkPHP 3.1.2 - PHP的开发框架MVC - 含Core,Extend,Example

    ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架, 遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持...

Global site tag (gtag.js) - Google Analytics