`
zhhphappy
  • 浏览: 121340 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

敏捷设计原则

阅读更多

软件设计是一个抽象的概念。它和程序的概括形状(Shape)、结构以及每一个模块、类和方法的详细形状和结构有关。可以使用许多不同的媒介去描绘它,但是它最终体现为源代码。最后,源代码就是设计。

      拙劣设计的症状

  • 僵化性(Rigidity):设计难以改变。很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。
  • 脆弱性(Fragility):设计易于遭到破坏。对系统的改动会导致系统中和改动的地方在概念上无关的许多地方发现问题。
  • 牢固性(Immobility):设计难以重用。很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。
  • 粘滞性(Viscosity):难以做正确的事情。做正确的事情比做错误的事情要困难。
  • 不必要的复杂性(Needless Complexity):过分设计。设计中包含有不具有任何直接好处的基础结构。
  • 不必要的重复性(Needlsee Repetition):滥用复制/粘贴。设计中包含有重复的结构,而该重复的对象本可以使用单一的抽象进行统一。
  • 晦涩性(Opacity):很难阅读、理解。没有很好的表现出意图。

      面向对象设计原则

  • 单一职责原则(The Single Responsibility Principle,简称SRP)
  • 开放-封闭原则(The Open-Close Principle,简称OCP)
  • Liskov替换原则(The Liskov Subsititution Principle,简称LSP)
  • 依赖倒置原则(The Dependency Inversion Principle,简称DIP)
  • 接口隔离原则(The Interface Segregation Interface,简称ISP)


 单一职责原则(SRP)
    
就一个类而言,应该仅有一个引起它变化的原因。
     在SRP中,我们把职责定义为“变化的原因”。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的原则。
     应用FACADE或PROXY模式对设计进行重构可以帮助分离类的职责。

开放—封闭原则(OCP)
   
软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的。

    遵循开放—封闭原则设计的模块具有两个主要的特征,他们是:
   1、“对于扩展是开放的”(Open for extension)。
        这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换句话说,我们可以改变模块的功能。
   2、“对于更改是封闭的”(Closed for modification)。
    对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者Java的“.jar”文件,都无需改动。

    这两个特征好像是互相矛盾的。扩展模块的行为的通常方式就是修改该模块的源代码。不允许修改的模块常常被认为是具有固定的行为。

   

    在面向对象的语言中,可以创建出固定却能够描述一组任意个可能行为的抽象体。这个抽象体就是抽象基类。而这一组任意个可能的行为则可以表现为可能的派生类。

    模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,所以它对于更改是可以关闭的。同时,通过这个抽象体派生,也可以扩展此模块的行为。

 

实际上使用抽象接口比使用抽象类通常具有更好的效果。
  
   在许多方面,OCP是面向对象设计的核心所在。遵循这个原则可带来面向对象技术所声称的巨大好处(灵活性、可重用性以及可维护性)。然而,对于应用程序的 每个部分都肆意地进行抽象并不是一个好主意。应该仅仅对程序中呈现出频繁变化的那部分作出抽象。拒绝不成熟的抽象和抽象本身一样重要。

 

Liskov简单替换原则(LSP)
       OCP背后的主要机制是抽象(abstraction)和多态(polymorphisim),支持抽象和多态的关键机制之一是继承。采用Liskov简单替换原则将保证系统使用了最佳的继承层次,正确使用继承不违反OCP。

      子类型(subtype)必须能够替换掉他们的基类型(base type)
    “这里需要如下替换性质:若对每个类型S的对象s1,都存在一个类型T的对象s2,使得在所有针对T编写的程序P中,用s1替换s2后,程序P行为功能不变,则S是T的子类型。”


——Barbara Liskov


       LSP让我们得出一个非常重要的结论:一个模型,如果孤立的看,并不具有真正意义上的有效性。模型的有效性只能通过它的客户程序来表现。

      在考虑一个特定设计是否恰当时,不能完全孤立地来看这个解决方案。必须要根据该设计的使用者作出的合理假设来审视它。

       1、基于契约设计

       为了使“合理假设”明确化,更好支持LSP,可以采用基于契约设计(Design Contract,简称DBC)方法。
        基于DBC方法,派生类的前置条件和后置条件规则是:
       在重新声明的派生类中的例程(routine)时,只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件。

       2、不易察觉的违反LSP的设计
       a、 派生类的退化函数
       派生类的某些函数退化(变得没有用处),Base的使用者不知道不能调用f,会导致替换违规。在派生类中存在退化函数并不总是表示违反了LSP,但是当存在这种情况时,应该引起注意。
      b、从派生类抛出异常
      如果在派生类的方法中添加了其基类不会抛出的异常。如果基类的使用者不期望这些异常,那么把他们添加到派生类的方法中就可以能会导致不可替换性。

      LSP是保证OCP的重要原则。

 

依赖倒置原则(DIP)
     高层模块不应该依赖于底层模块。二者都应该依赖于抽象。
     抽象不应该依赖于细节,细节应该依赖于抽象。

 

      1、本质上倒置的应该是接口所有权。
      低层模块实现了在高层模块中声明并被高层模块调用的接口。

      2、依赖于抽象
      程序中所有的依赖关系都应该终止于抽象类或接口。
      任何变量都不应该持有一个具体类的指针和引用。
      任何类都不应该从具体类派生。
      任何方法都不应该覆写它的任何基类中已经实现的方法。

 

接口隔离原则(ISP)
      不应该强迫客户依赖于它们不使用的方法。

       一个对象的客户不是必须通过该对象的接口去访问它,也可以通过委托或者该对象的基类去访问它。

      如何使用ISP
      1、对客户进行分组
      常常可以根据客户调用的服务方法来对客户进行分组。这种分组方法使得可以为每组而不是每个客户创建分离的接口。

      2、改变接口
       在维护面相对象的程序时,常常会改变现有的类和组件的接口。为了减少这些改变的影响。可以通过为现有的对象增加新接口的方法来缓解,而不是去改变现有的接口。

胖类(fat class)会导致它们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求该类进行一个改动时,会影响到其他所有的客户程序。因此,客户程序应该依赖于它们实际调用的方法。通过把胖类的接口分解为多个特定客户程序的接口,可以实现这个目标。

分享到:
评论

相关推荐

    敏捷开发设计原则PPT讲稿

    敏捷开发是一种以适应快速变化需求为核心的软件开发方法论,它强调灵活性、互动性和客户合作。...总的来说,敏捷设计原则旨在创建能够适应变化、易于理解和修改的软件系统,同时促进团队间的高效协作。

    敏捷开发原则

    ### 敏捷开发原则详解 #### 一、引言 敏捷开发是一种强调适应性和灵活性的软件开发方法论,旨在提高团队的工作效率并确保项目的成功。本文将深入探讨敏捷开发的核心原则,包括其背景、核心价值观以及十二项指导原则...

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

    此外,书中还涵盖了敏捷估算和规划、敏捷设计原则、重构以及技术债务等关键话题。敏捷估算通常采用故事点,强调相对而不是绝对的规模,以减少不确定性的影响。敏捷设计则注重简洁性和可测试性,鼓励模块化和面向对象...

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

    《敏捷软件开发原则、模式与实践》一书是由著名软件开发专家、软件工程大师Robert C. Martin所著。这本书自出版以来,就被视为敏捷开发领域内的经典之作,对于软件开发人员、项目经理以及软件项目领导者来说,它提供...

    敏捷软件开发:原则、模式与设计.pdf

    敏捷软件开发:原则、模式与设计.pdf敏捷软件开发:原则、模式与设计.pdf

    第三届敏捷大会幻灯片

    5. 敏捷设计原则:Paulo Caroli的演讲可能涵盖了敏捷设计的一些关键原则,如保持设计简单,使未完成的工作最小化,以及持续集成和测试驱动开发(TDD)。 6. 敏捷估算与规划:敏捷开发中的估算和规划不同于传统的...

    敏捷软件开发 原则模式与实践

    2. **设计原则**:书中涵盖了设计模式和SOLID原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则有助于创建可维护、可扩展的代码结构。 3. ...

    敏捷软件开发:原则、模式与设计 (中文pdf版)1

    敏捷软件开发:原则、模式与设计 (中文pdf版)

    敏捷软件开发:原则、模式与实践(带书签,源码)

    书中结合了敏捷开发的原则、设计模式以及实际操作的实践,为读者提供了一个全面的敏捷开发视角。 敏捷软件开发的核心理念是适应变化,强调快速反馈、迭代开发和持续改进。这一理念源于2001年的敏捷宣言,它提倡个体...

    敏捷软件开发:原则、模式与设计

    2003年6月荣获美国《软件开发》第13届震撼(jolt)大奖! 在本书中,享誉全球的软件开发专家和软件...●使用真实案例讲解如何用极限编程来设计、测试、量构和结对编程 ●包含了极具价值的可多次使用的c++和java源代码。

    HUAWEI-敏捷园区网络解决方案设计指南和最佳实践

    业务特性设计和最佳实践,从可靠性、安全性、敏捷特性等方面展开敏捷园区网络需要关注的各业务的设计原则和最佳实践。 推荐版本和推荐产品选型:介绍敏捷园区解决方案推荐的版本和设备选型。 产品介绍:介绍敏捷园区...

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

    第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER...

    敏捷软件开发:原则、模式与实践(带书签+源码)

    《敏捷软件开发:原则、模式与实践》是一本深度探讨敏捷开发理念和技术的权威著作,由业界知名专家Robert C. Martin(简称Uncle Bob)撰写。这本书不仅提供了丰富的理论知识,还结合实际案例,深入浅出地介绍了如何...

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

    本书讲授了一些原则、模式...本书探索了基本的设计原则,软件设计结构的通用模式以及有利于团队融为一个有机整体的一系列实践。本书包含了许多代码,仔细研读这些代码是学习本书所教授的原则、模式及时间的最有效方法

    敏捷软件开发:原则、模式与实践清晰扫描中文版PDF(503页完整版)

    本书《敏捷软件开发:原则、模式与实践》是由全球知名的软件开发专家和软件工程大师Robert C. Martin所著,该书是关于敏捷开发与极限编程的综合性、实用性指南。书中深入探讨了软件开发人员、项目经理以及软件项目...

    敏捷软件开发:原则 模式与实践 C#版

    本书中,享誉全球的软件开发专家和软件工程大师RobertC.Martin深入而生动地使用真实案例讲解了面向对象基本原则、重要的设计模式、UML和敏捷实践等程序员必备的知识。本书于2003年荣获第13届Jolt大奖,是C++和Java...

    敏捷软件开发:原则、模式与实践(Agile.software.development:Principles,Patterns,and.Practices)中英版

    《敏捷软件开发:原则、模式与实践》是Robert C. Martin(也被业界称为Uncle Bob)的经典著作,这本书深入探讨了敏捷开发的核心理念,并通过实际案例介绍了如何在项目中运用这些原则、模式和最佳实践。这本书分为两...

    敏捷软件开发原则 模式与实践 c#源码

    源码分析可以帮助我们理解如何将敏捷原则和模式应用于实际项目,例如如何利用C#的特性实现松耦合、高内聚的设计,以及如何利用TDD(测试驱动开发)来驱动代码编写。 6. **持续集成与自动化**:在敏捷环境中,持续...

    敏捷软件开发原则、模式与实践第19章C++源码

    读者可以通过阅读源码,了解如何在实际项目中应用敏捷原则,以及如何利用设计模式解决复杂问题。同时,通过对单元测试的理解,可以掌握软件质量保证的重要性。这不仅对初学者,对经验丰富的开发者来说也是一个有价值...

    浅谈敏捷开发中的设计.doc

    不过,敏捷设计并不像传统开发那样产生详尽的文档,而是更加注重可执行的、轻量级的设计输出。 **数据结构设计**在敏捷和传统开发中都是必不可少的。敏捷开发的数据结构设计通常从业务模型(领域模型)开始,然后...

Global site tag (gtag.js) - Google Analytics