`

也读《敏捷软件开发》--- OOP原则

 
阅读更多
面向对象程序设计(OOP,Object Oriented Programming)的原则:

1.SRP(Single Responsibility Principle)单一责任原则

“一个类,只能有一个引起它变化的原因。”

在SRP中,我们把职责定义为“变化的原因”。如果你能够想到多于一个动机去改变一个类,那么这个类就具有多于一个的职责。
如果一个类承担了过多的职责,就等于把这些职责耦合在了一起。一个职责的变化可能会消弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。
不过,在判定一个类的职责时应该考虑实际的发生情况,如果没有征兆就SRP,或者使用任何其他的原则都是不明智的。

2.OCP(Open-Closed Principle)开放-封闭原则

“软件实体(类、模块、方法等)应该可以扩展的,但是不可修改。”

遵循OCP原则设计出的模块具有以下特征:
1)对扩展是开放的(Open for extension)
这意味着模块的行为是可以通过扩展的形式添加新功能的。
2)对更改时关闭的(Closed for modification)
同时,在对模型进行扩展的时候,不必改动模块的源码或二进制代码(dll、jar等)。

实现遵循这两个原则模块的方法关键是:抽象。
模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,所以它对应更改可以是关闭的。同时,通过这个抽象体派生类,可以扩展该模块的行为。

不过,遵循OCP代价也是昂贵的。创建正确的抽象是要花费开发时间和精力的。同时,那些抽象也增加了软件设计的复杂性。开发人员有能力处理的抽象数量也是有限的,显然,我们希望把OCP的应用限定到可能发生的变化上是最好的,这就需要开发人员的观察、分析了。

在许多方面,OCP都是面向对象的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处(也就是,灵活性、可重用性和可维护性)。然而,并不是说只要使用一种面向对象语言就要遵循这一原则。对于应用程序中的每一部分都肆意的抽象同样不是一个好主意。正确的做法是,开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

3.LSP(Liskov Substitution Principle)里氏替换原则

“子类型必须能够替换掉它的基类型。”

OCP是OOD中很多说法的核心。如果这个原则应用的有效,应用程序就会具有更多的可维护性、可重用性及健壮性。LSP是使OCP成为可能的原则之一。正是子类型的可替代性才使得使用基类类型的模块在无需修改的情况下就可以扩展。这种可替换性必须是开发人员可以隐式依赖的东西。因此,如果没有显式地强制基类类型的契约,那么代码就必须良好地并且明显的表达出这一点。
术语“IS-A”的含义过于宽泛以至于不能作为子类型的定义。子类型的正确定义是“可替换性的”,这里的可替换性可以通过显式或隐式的契约来定义。

4.DIP(Dependency-Inversion Principle)依赖倒置原则

“抽象不应该依赖于细节,细节应该依赖于抽象。”

(1)高层模块不应该依赖于底层模块,二者都应该依赖于抽象;
(2)抽象不依赖于具体细节,细节依赖于抽象;
“倒置”一词是相对于面向过程的程序设计而言的,面向过程的程序设计中通常会创建一下高层模块依赖底层模块、策略依赖于具体实现细节的软件结构。而一个良好的面向对象的程序设计,其设计结构相对于传统的面向过程的而言就是“倒置”了。

每一个较高层次都为它所需要的服务声明一个抽象接口,较低层次实现这些接口,每个高层次都通过这些接口使用下一层,这样高层就不用依赖于低层。低层反而依赖于高层提供的接口。

请注意这里的倒置不仅仅是依赖关系的倒置,它也是接口所有权的倒置。我们通常认为工具库应该拥有它们自己的接口。但是当应用了DIP时,我们发现往往是客户拥有抽象接口,而它们的服务提供者则从这些抽象接口派生。

依赖倒置原则是许多面向对象技术所宣称的好处的基本机制。它的正确使用对应创建可重用的框架是必须的。同时它对于构建在变化面前富有弹性的代码也是非常重要的。由于抽象和细节被彼此分离,所以代码页非常容易维护。

5.ISP(Interface Insolution Principle)接口隔离原则

“不应该强迫用户依赖于它们不用的方法。”

胖类(fat class)会导致它们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求这个胖类做一些改动时,会影响到所有其他的客户程序。因此,客户程序应该仅仅依赖于它们实际调用的方法。通过把胖类的接口分解为多个特定于客户程序的接口,可以实现这个目标。每个特定于客户程序的接口仅仅声明它的特定客户组调用的那些函数。接着,该胖类就可以实现所有特定客户程序的接口,并实现相应的方法。这就解除了客户程序和它们没有调用的方法见的依赖关系,并使客户程序之间互不依赖。

6.其他
。。。。。。
分享到:
评论

相关推荐

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

    《敏捷软件开发:原则、模式与实践》是软件开发领域一本极为重要的著作,它深入探讨了面向对象设计的原则、敏捷开发的方法以及实际操作中的最佳实践。这本书为开发者提供了丰富的知识和指导,帮助他们构建高质量、可...

    研究生课程 软件开发-笔记1

    在现代软件开发中,面向对象编程(OOP)原则和设计模式也是核心内容。这些原则如封装、继承、多态,以及设计模式如工厂模式、单例模式、观察者模式等,能帮助开发者构建可扩展和易于维护的软件结构。 最后,随着...

    软件开发基础1-01

    了解软件开发生命周期(SDLC)和敏捷开发方法(如Scrum或Kanban)有助于团队协作和项目管理。 11. **调试技巧**:学习如何使用调试工具查找和修复代码中的错误,是每个开发者必备的技能。 12. **测试**:单元测试...

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

    本书介绍了敏捷、OOP、设计模式和UML

    Head First软件开发 中文版

    3. **面向对象编程**(OOP):面向对象的编程是现代软件开发的核心,本书会教授如何通过类和对象来设计软件系统,包括继承、封装、多态等OOP原则。 4. **设计模式和原则**:软件设计模式如单例模式、工厂模式等,...

    软件开发设计外文翻译-软件开发概念和设计方法大学论文.doc

    总之,软件开发的概念和设计方法经历了从早期的盲目应用到工程化、结构化的过程,再到如今的敏捷、面向对象和模型驱动的演变。随着技术和实践的不断进步,软件设计方法将持续创新,以满足日益复杂的软件需求和不断...

    软件开发核心心得.pdf

    的面向对象代码是软件开发的核心,这涉及到对编程语言特性的深入理解、良好的设计原则和模式的应用,以及对代码质量的严格把控。面向对象设计的精髓在于将现实世界的问题映射为对象和它们之间的交互,从而提高代码的...

    软件工程课件(软件工程-面向对象和传统的方法)

    软件工程是一门涉及软件开发全过程的学科,它不仅关注编程技术,更强调软件开发的系统性、规范性和可维护性。本课件针对大三学生,旨在深入探讨面向对象方法和传统方法在软件工程中的应用,帮助学生建立起完整的软件...

    敏捷思维-架构设计中的方法学.pdf

    **敏捷(Agile)** 是一种强调快速响应变化、重视客户合作、持续交付工作软件的软件开发方法。敏捷方法的核心理念包括:个体与交互高于流程与工具,可工作的软件高于详尽的文档,客户合作高于合同谈判,响应变化高于...

    面向对象数据结构与软件开发

    ### 面向对象数据结构与软件开发 #### 核心知识点详解 ##### 一、面向对象编程(OOP)基础 **定义:** 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和操作这些数据的方法的封装体。 **...

    软件开发十钟关键技术.doc

    掌握SQL语言和数据库设计原则对于数据驱动的软件开发非常重要。 6. 版本控制系统 (Version Control): 如Git,用于管理代码版本,协同开发和追踪更改,确保团队合作的效率和代码质量。 7. 框架和库: 例如Spring...

    2012年软件开发工具重点复习资料

    ### 2012年软件开发工具重点复习资料 #### 软件配置与集成 **软件配置(集成)**是指设立一个有效的总控部分,它能够在各个具体工具之上实现信息的正确传递与转换,帮助人们完成协调与配合的工作,从而形成一个...

    软件系统开发方法PPT学习教案.pptx

    3.6 敏捷软件开发技术 敏捷方法强调快速响应变化,通过短迭代周期和持续集成来提高开发效率和软件质量。敏捷方法论包括Scrum、Extreme Programming(XP)、Feature-Driven Development(FDD)等。它们倡导团队合作...

    IBM面向对象软件开发和过程

    面向对象软件开发是一种广泛采用的现代编程方法,它基于“对象”的概念,这些对象是现实世界中的实体在软件中的抽象。IBM作为一家全球知名的科技公司,提供了丰富的资源和教程来帮助开发者理解和应用面向对象技术。...

    软件研发经理简历模板表格.doc

    【知识点详解】 ...综上所述,这份简历突显出的IT知识点包括软件研发管理、敏捷开发、面向对象设计、设计模式、Web客户端开发、医学图像处理、项目管理和技术领导力,以及在不同行业的软件开发经验。

    北京大学研究生软件工程课程

    8. **敏捷软件开发方法**和**面向对象方法-RUP**:这两部分深入讲解了Rational统一过程(RUP)这一敏捷开发框架,以及敏捷方法如极限编程(XP)和水晶方法,强调快速反馈、适应性和团队协作。 通过这门课程,学生...

    敏捷Rails中文教程

    - **敏捷开发**:一种强调快速迭代、响应变化的软件开发方法论,其核心在于通过小步快跑的方式来应对不断变化的需求。 - **Rails对敏捷的支持**: - **数据库重构**:Rails支持在开发过程中灵活地修改数据库结构,...

    welcome to see it--软件工程课件

    开发模型,如瀑布模型、迭代模型、螺旋模型和敏捷开发模型,提供了不同的软件开发流程框架,以适应不同项目的需求和风险。 软件工程的质量评估标准则关注软件的可靠性、可用性、可维护性、效率、兼容性、安全性和可...

Global site tag (gtag.js) - Google Analytics