基本原则
· 封装变化Encapsulate what varies.
· 面向接口变成而不是实现 Code to an interface rather than to an implementation.
· 优先使用组合而非继承 Favor Composition Over Inheritance
SRP: The single responsibility principle 单一职责
系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。
Every object in your system should have a single responsibility ,and all the object s services should be focused on carrying out that single responsibility .
1. 每一个职责都是一个设计的变因,需求变化的时候,需求变化反映为类职责的变化。当你系统里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了SRP原则。
2. 如果一个类承担的职责过多,就等于把这些职责耦合在了一起。一个职责的变化就可能削弱或者抑制这个类其它职责的能力。这种设计会导致脆弱的设计。当变化发生的时候,设计会遭到意想不到的破坏。
3. SRP 让这个系统更容易管理维护,因为不是所有的问题都搅在一起。
4. 内聚Cohesion 其实是SRP原则的另外一个名字.你写了高内聚的软件其实就是说你很好的应用了SRP原则。
5. 怎么判断一个职责是不是一个对象的呢?你试着让这个对象自己来完成这个职责,比如:“书自己阅读内容”,阅读的职责显然不是书自己的。
6. 仅当变化发生时,变化的轴线才具有实际的意义,如果没有征兆,那么应用SRP或者任何其它的原则都是不明智的。
DRY : Don't repeat yourself Principle
通过抽取公共部分放置在一个地方避免代码重复.
Avoid duplicate code by abstracting out things that are common and placing those thing in a single location .
1. DRY 很简单,但却是确保我们代码容易维护和复用的关键。
2. 你尽力避免重复代码候实际上在做一件什么事情呢?是在确保每一个需求和功能在你的系统中只实现一次,否则就存在浪费!系统用例不存在交集,所以我们的代码更不应该重复,从这个角度看DRY可就不只是在说代码了。
3. DRY 关注的是系统内的信息和行为都放在一个单一的,明显的位置。就像你可以猜到正则表达式在.net中的位置一样,因为合理所以可以猜到。
4. DRY 原则:如何对系统职能进行良好的分割!职责清晰的界限一定程度上保证了代码的单一性。
OCP : Open-Close Principle开闭原则
类应该对修改关闭,对扩展打开;
Classes should be open for extension ,and closed for modification .
1. OCP 关注的是灵活性,改动是通过增加代码进行的,而不是改动现有的代码;
2. OCP的应用限定在可能会发生的变化上,通过创建抽象来隔离以后发生的同类变化
3. OCP原则传递出来这样一个思想:一旦你写出来了可以工作的代码,就要努力保证这段代码一直可以工作。这可以说是一个底线。稍微提高一点要求,一旦我们的代码质量到了一个水平,我们要尽最大努力保证代码质量不回退。这样的要求使我们面对一个问题的时候不会使用凑活的方法来解决,或者说是放任自流的方式来解决一个问题;比如代码添加了无数对特定数据的处理,特化的代码越来越多,代码意图开始含混不清,开始退化。
4. OCP 背后的机制:封装和抽象;封闭是建立在抽象基础上的,使用抽象获得显示的封闭;继承是OCP最简单的例子。除了子类化和方法重载我们还有一些更优雅的方法来实现比如组合;
怎样在不改变源代码(关闭修改)的情况下更改它的行为呢?答案就是抽象,OCP背后的机制就是抽象和多态
5. 没有一个可以适应所有情况的贴切的模型!一定会有变化,不可能完全封闭.对程序中的每一个部分都肆意的抽象不是一个好主意,正确的做法是开发人员仅仅对频繁变化的部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。
6. OCP是OOD很多说法的核心,如果这个原则有效应用,我们就可以获更强的可维护性可重用 灵活性 健壮性 LSP是OCP成为可能的主要原则之一
LSP: The Liskov substitution principle
子类必须能够替换基类。
Subtypes must be substitutable for their base types.
1. LSP关注的是怎样良好的使用继承.
2. 必须要清楚是使用一个Method还是要扩展它,但是绝对不是改变它。
3. LSP清晰的指出,OOD的IS-A关系是就行为方式而言,行为方式是可以进行合理假设的,是客户程序所依赖的。
4. LSP让我们得出一个重要的结论:一个模型如果孤立的看,并不具有真正意义的有效性。模型的有效性只能通过它的客户程序来表现。必须根据设计的使用者做出的合理假设来审视它。而假设是难以预测的,直到设计臭味出现的时候才处理它们。
5. 对于LSP的违反也潜在的违反了OCP
DIP:依赖倒置原则
高层模块不应该依赖于底层模块二者都应该依赖于抽象
抽象不应该依赖于细节细节应该依赖于抽象
1. 什么是高层模块?高层模块包含了应用程序中重要的策略选择和业务模型。这些高层模块使其所在的应用程序区别于其它。
2. 如果高层模块依赖于底层模块,那么在不同的上下文中重用高层模块就会变得十分困难。然而,如果高层模块独立于底层模块,那么高层模块就可以非常容易的被重用。该原则就是框架设计的核心原则。
3. 这里的倒置不仅仅是依赖关系的倒置也是接口所有权的倒置。应用了DIP我们会发现往往是客户拥有抽象的接口,而服务者从这些抽象接口派生。
4. 这就是著名的Hollywood原则:"Don't call us we'll call you."底层模块实现了在高层模块声明并被高层模块调用的接口。
5. 通过倒置我们创建了更灵活 更持久更容易改变的结构
6. DIP的简单的启发规则:依赖于抽象;这是一个简单的陈述,该规则建议不应该依赖于具体的类,也就是说程序汇总所有的依赖都应该种植于抽象类或者接口。
7. 如果一个类很稳定,那么依赖于它不会造成伤害。然而我们自己的具体类大多是不稳定的,通过把他们隐藏在抽象接口后面可以隔离不稳定性。
8. 依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方
9. 依赖倒置原则是实现许多面向对象技术多宣称的好处的基本底层机制,是面向对象的标志所在。
ISP:接口隔离原则
不应该强迫客户程序依赖它们不需要的使用的方法。
1. 接口不是高内聚的,一个接口可以分成N组方法,那么这个接口就需要使用ISP处理一下。
2. 接口的划分是由使用它的客户程序决定的,客户程序是分离的接口也应该是分离的。
3. 一个接口中包含太多行为时候,导致它们的客户程序之间产生不正常的依赖关系,我们要做的就是分离接口,实现解耦。
4. 应用了ISP之后,客户程序看到的是多个内聚的接口。
分享到:
相关推荐
"分布式高并发.pdf" 本文档主要介绍了分布式高并发系统的设计和实现,涵盖了大型网站系统的特点、架构演化、微服务、缓存、消息队列、搜索...设计模式与实践包括OOP五大原则、设计模式、代理模式、面向切面编程等。
- OOP五大原则SOLID:是面向对象编程中的五大设计原则。 - 设计模式:包括代理模式、面向切面编程(AOP)等。 - RBAC(基于角色的访问控制):一种权限管理模型。 在面试中,针对上述知识点进行准备,不仅需要掌握...
SOLID原则是OOP设计中最重要的五个原则,它们分别是: 1. 开闭原则(Open-Closed Principle,OCP):一个软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这意味着当需求变更时,我们可以通过添加新...
在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭原则(Open-Closed Principle,简称 OCP)、里氏替换原则(Liskov Substitution Principle,...
C++ 面向对象设计五大原则是面向对象编程(OOP)中一个非常重要的概念,它们是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这五大原则是面向对象设计的基础,遵循这五大原则可以使我们...
浙江大学的OOP(面向对象程序设计)大程是计算机科学教育中的一个重要环节,它强调了使用面向对象的设计原则和方法来构建软件系统。在本项目中,学生被要求使用C++语言来设计一个五子棋游戏,这既是对C++编程能力的...
1. **面向对象编程基础**:面向对象编程的基本原则包括封装、继承和多态。封装使得数据和方法能够安全地在一个类中隐藏,防止不适当的访问。继承允许创建新的类,这些类基于已存在的类(父类或超类),从而重用代码...
#### 二、OOP的基本原则 1. **封装**:封装是指将数据和对数据的操作绑定在一起,隐藏内部实现细节。在Java中,通过类和对象来实现封装。 2. **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和方法。...
### 面向对象编程五大基本原则 除了三大特性之外,面向对象编程还遵循一系列基本原则,以提高软件的质量、可维护性和可扩展性。 #### 单一职责原则(SRP) 单一职责原则指出一个类应该只有一个引起它变化的原因。...
- **子系统划分**:将大问题分解为多个小部分。 - **类的选择**:根据需求选择或设计适当的类。 - **方法设计**:为类添加合适的方法。 - **类体设计**:实现类的具体逻辑。 - **向量类设计**:以向量类为例,详细...
2. **SOLID原则**:这是面向对象设计的五个基本原则,包括单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。 3. **软件架构**:如MVC(模型-视图-控制器)、MVVM(模型-视图-ViewModel)等,...
面向对象原则是编写高质量代码的基础,以下是五大基本原则: 一、面向接口编程而不是面向实现(Code to an interface rather than to an implementation) 面向接口编程是指在编写代码时,应该面向抽象的接口,而...
封装是OOP的关键原则之一,它隐藏了对象的内部细节,只对外提供公共接口进行交互。在Java中,通过访问修饰符(public、private、protected等)来实现封装,保护数据不被非法访问。例如,将成员变量声明为`private`,...
### OOP 内部测试笔试题知识点解析 #### 一、序列化与反序列化 1. **序列化的概念**: - 序列化是指将对象的状态转换为可以存储或传输的形式的过程。通常用于保存对象的状态或者进行网络传输。 2. **序列化的...
封装是OOP的核心原则之一,它限制了对象内部数据的访问,只允许通过特定的方法进行操作。在"oop_tank"项目中,每个游戏元素的属性(如坦克的位置、速度)都应该是封装的,只能通过预设的接口(如移动函数)来改变,...
封装是OOP的核心原则之一,它隐藏了对象内部的实现细节,只对外提供公共接口。在Java中,通过访问修饰符(public, private, protected)来控制类的成员对其他类的可见性。这样可以防止代码的意外修改,增强代码的...
封装是OOP的基本原则之一,它隐藏了对象的内部实现细节,只对外提供公共接口。这有助于保护数据的安全,防止外部代码随意修改对象状态: ```python class BankAccount: def __init__(self, balance=0): self.__...