1、单一职责原则(SRP):
就一个类而言,应该仅有一个引起它变化的原因
。
我们在编程的时候,经常会给一个类添加各种各样的功能,如果一个类承担的职责过多,就相当于把这些职责耦合在了一起,一个职责的变化可能会削弱或者一直这个类完成其他职责的能力,这种耦合会导致脆弱的设计。在SRP中,将
职责
定义为“引起变化的原因”。如果有多于一个的动机改变一个类,这个类就有多于一个职责,这时候就应该考虑类的职责分离。
在设计中为每一种职责设计一个类,SRP是最简单、也是需要考虑最多的原则,实际上,软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。
2、开放-封闭原则(OCP)
软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的。
开放-封闭原则有两个主要的特征:
对于扩展是开放的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换句话说,我们可以改变模块的功能
对于更改是封闭的,对模块行为扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可连接的库、DLL或者java的.jar文件,都无需改动。
在C++、Java或者其他的OOPL中,可以创建出固定的却能够描述一组任意个可能行为的抽象体、这个抽象体就是抽象基类,而这一组任意个的行为则表现为可能的派生类。模块可以操作一个抽象体,由于模块依赖于一个固定的抽象体,所以它对于更改可以是关闭的。同时,通过从这个抽象体派生,也可以扩展此模块的行为。OCP的通常做法是,首先定义抽象实体,在面对需求的时候,增加新代码派生该实体,而不是更改现有的代码,这就是“开放-封闭原则”的精神所在。这样就不会引起连锁的改动,同时扩展了模块的行为。
但是可能会有这样的疑问,那我如何定义抽象体来保证封闭呢。答案是,绝对的对修改关闭时不可能的。无论模块多么的“封闭”,都会存在一些无法对峙封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜出最有可能发生的变化种类,然后构造抽象来隔离这些变化。创建正确的抽象是要花费开发时间和精力的。同时,这些抽象也增加了软件设计的复杂性。
开发-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
3、依赖倒置原则(DIP)
a、高层模块不应该依赖于底层模块,两个都应该依赖于抽象
b、抽象不应该依赖于细节。细节应该依赖抽象
在传统的软件开发中,比如结构化的分析和设计,总是倾向于创建一些高层模块依赖于底层模块、策略(policy)依赖于细节的软件结构。实际上这些方法的目的之一就是要定义子程序层次结构,该层次结构描述了高层模块怎样调用底层模块。一个设计良好的面向对象的程序,其依赖程序结构相对于传统的过程式方法设计的通常结构而言就是被“倒置”了。该原则是框架设计的核心原则。
所有结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务。这里的倒置不仅仅是依赖关系的倒置,它是接口所有权的倒置。我们通常会认为底层应该拥有它们自己的接口。但是在DIP中,我们发现往往是高层拥有抽象接口,而底层则派生这些抽象接口。通过这种倒置的接口所有权,底层的任何改动都不会再影响到高层。
依赖倒置其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计。
4、里氏代换原则(LSP)
子类型必须能够替换它们的父类型
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。
正是里氏代换原则,使得继承复用成为了可能,只有当子类可以替换成父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。也正是由于子类型的可替换性才使得使用父类类型的模块
5、接口隔离原则(ISP)
不应该强迫客户端依赖于他们不会使用的接口
在设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由一个类实现,我们可以把系统抽象成一个接口。但是当我们想要添加一个新的模块扩展程序时,如果要添加的模块只包含原系统的一些子模块,那么就会强迫我们实现接口中的所有方法,而且还要编写一些unsupported方法。这样的接口被称为胖接口或者叫污染的接口,使用这样的接口将会给系统引入不正确的行为。
接口隔离原则则表明客户端不应该强迫实现一些他们不会使用的接口,应该把胖接口的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。
分享到:
相关推荐
笔记中可能会涵盖主流编程语言(如Java、Python或C++)的基本语法、面向对象编程概念,以及良好的编程实践,如注释规范、异常处理和单元测试。 五、软件测试 测试是确保软件质量的关键步骤,包括单元测试、集成测试...
此外,笔记可能还会涵盖面向对象设计原则,如单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、接口隔离原则...
3. 设计原则:遵循模块化、抽象、封装、继承、多态等面向对象设计原则,提高代码的可读性和可维护性。 二、设计模式与架构 1. 设计模式:熟悉常见的23种GOF设计模式,如工厂模式、单例模式、观察者模式等,了解其...
在学习笔记中,这部分会讲解如何进行有效的项目管理,如使用敏捷开发方法,以及如何运用统一过程(RUP)等框架进行软件开发。 二、设计原则与模式 设计原则如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则...
在现代软件开发中,面向对象编程(OOP)原则和设计模式也是核心内容。这些原则如封装、继承、多态,以及设计模式如工厂模式、单例模式、观察者模式等,能帮助开发者构建可扩展和易于维护的软件结构。 最后,随着...
面向对象设计(OOD)是软件设计的核心,涉及类、对象、继承、封装、多态等概念。理解类与对象的关系,如何使用接口定义行为,以及如何通过抽象和继承来组织代码,都是重要的学习内容。 五、数据库设计与管理 数据库...
了解瀑布模型、敏捷开发、迭代模型等软件开发流程,掌握UML(统一建模语言)用于系统建模,以及需求分析文档的编写,如需求规格说明书、用例图和活动图等。 二、编程语言与数据结构 编程语言是软件设计师的工具,如...
在软件工程基础知识中,重点讲解了开发模型(如瀑布模型、敏捷模型等)、设计原则(如开闭原则、单一职责原则等)、测试方法(如黑盒测试、白盒测试等)、质量和CMM(能力成熟度模型)等。面向对象部分,除了基础...
- 对象工程:关注面向对象设计和开发。 - 过程工程:强化了软件开发过程,包括过程模型、过程改进和过程控制。 - 构建工程:强调软件的快速构建和版本迭代,常见于敏捷开发方法。 5. 软件工程的七个原则: - ...
以上是根据“软件设计师中级王勇老师课程笔记-6程序设计语言与语言处理基础”整理出来的关键知识点。通过深入学习这些内容,不仅能够帮助考生顺利通过软考-软件设计师中级考试,还能为将来从事软件开发工作打下坚实...
4. **软件工程**:软件生命周期模型(如瀑布模型、迭代模型、敏捷开发)及其适用场景,需求分析、设计、编码、测试和维护阶段的工作内容。此外,质量管理、配置管理和项目管理也是重要考点,如ISO9000系列标准、软件...
软件设计师考试笔记涉及了...以上是软件设计师考试笔记中的关键知识点,涵盖了软件开发的多个方面,包括模型、成本估算、设计原则、测试方法、敏捷开发和风险管理等。理解和掌握这些知识点对于软件设计师来说至关重要。
9. **程序设计语言层面**:程序设计语言包括面向过程、面向对象和面向构件的软件设计方法,这三种方法反映了不同设计思路。 10. **互联网时代软件工程方法**:互联网时代强调面向用户、随需即取、面向服务的架构、...
- 软件开发时期包括总体设计、详细设计、编码和单元测试、综合测试等阶段。 - 运行维护时期主要关注软件的长期维护。 2. **软件过程**: - 定义了一组为了获得高质量软件所需完成的任务框架。 - 规定了完成任务...
它支持面向对象开发过程的所有阶段,从需求分析到软件维护,并且适用于各种软件开发方法。 ### UML在软件开发中的作用 UML提供了丰富的图表来描述软件系统的各个方面,帮助开发者更好地理解、设计、实现和测试软件...
- **喷泉模型**:适用于面向对象开发。 - **现代软件过程模型**: - **Rational统一过程模型(RUP)**:强调迭代开发和架构为中心。 - **敏捷过程与极限编程(XP)**:灵活应对变化,快速反馈。 - **微软过程**...
在这一阶段,我们需要依据需求分析结果,采用合适的架构设计方法,如模块化、面向对象设计等,制定软件的总体结构和组件间的交互方式。设计时应考虑系统的可扩展性、可维护性和性能要求。 编码是实现设计的具体步骤...
- **方法**: 包括面向对象的需求分析、数据流图、用例图等。 - **案例分析**: 通过实际案例学习如何进行有效的需求收集与分析。 #### 2. 软件设计 - **概念**: 软件设计是将软件需求转换为可以实现的具体方案的过程...
7. **软件设计与体系结构**:软件设计模式,如工厂模式、单例模式、观察者模式等,以及面向对象的设计原则。同时,会探讨软件架构风格,如层次结构、客户端-服务器、微服务等。 8. **法律法规**:了解与软件开发...
软件开发方法主要包括结构化方法、原型方法、面向对象方法、Jackson方法和敏捷开发方法等。结构化方法已被面向对象方法取代,而敏捷开发如极限编程(XP)强调灵活响应变化,测试先行,结对编程等实践提高了代码质量...