大话锦集(二)

任何需求的变更都需要成本的。

单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

开放-封闭原则

开发-封闭原则,是说软件实体(类,模块,函数等等)应该可以扩展,但是不可修改。可以从两个特征方面来说:对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)。

但是绝对的对修改关闭是不可能的,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

开放-封闭原则是面向对象的核心所在。遵循了这个原则就可以带来面向对象技术所生成的巨大好处,也就是可维护,可扩展,可服用,灵活性好。开发人员应该仅对在程序中频繁变化的那部分做出抽象,然而,对于应用程序中的每个部分刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

开放-封闭原则的精神:面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

依赖倒转原则

A 高层模块不应该依赖低层模块,两个都应该依赖抽象。

B 抽象不应该依赖细节。细节应该依赖抽象。

依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序并不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象设计,反之就是过程化设计。

里氏代换原则

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。

子类型必须能够替换掉它们的父类型。

只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

时间: 2024-12-12 11:13:46

大话锦集(二)的相关文章

大话锦集(三)装饰模式(Decorator)

装饰模式(Decorator)就是动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 其结构图如下: Component是定义一个对象接口,可以给这些对象动态地添加责任.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在.ConcreteDecorator就是具体的装饰对

大话锦集(四)代理模式-Proxy

概念 代理模式为其它对象提供一种代理以控制对这个对象访问. 结构图 Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy. class Subject{ public: virtual void request() = 0; }; RealSubject类,定义Proxy所代表的真实实体 class RealSubject : public Subject{ public: void request() { cou

大话锦集(五)-工厂方法模式和原型模式

工厂方法模式实现计算器的结构图 简答工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对客户端来说,去除了与具体产品的依赖. 工厂方法模式(Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行. 工厂方法模式克服了简单工厂违背开放-

菜鸟前端程序员小知识点锦集二

1. 数组排序      Array---sort()方法:     1> 用sort方法对字母排序:         var arr=new Array(6)         arr[0]=a.. arr[1]=...         arr.sort();         排出来按a-z的顺序排     2> 用sort方法对数字排序:         arr.sort(sortNumber);从小到大对数字排序.     3> 如果按照其他标准进行排序,需提供函数,        

php面试需要掌握的基础题目锦集

1.session与cookie的区别? 答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的. 两者都可通过时间来设置时间长短 2.如何修改SESSION的生存时间 答:方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache 方法2:$savePath 

PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/problem-sets/994805046380707840/problems 目录 (点击对应题目即可进入相应题解--小声BB--) L1-001 Hello World (5 分) L1-002 打印沙漏 (20 分) L1-003 个位数统计 (15 分) L1-004 计算摄氏温度 (5

iOS--碎片知识锦集

知识锦集day01 1.UIView的两个方法: sizeThatFits和 sizeToFit 官方文档上说: - (CGSize)sizeThatFits:(CGSize)size;     //----->返回一个最接近你填的参数的最适合的Size,  不是真的去重新调整View的size,默认使用原先已存在的Size作用:return 'best' size to fit given size. does not actually resize view. Default is retu

J-Query开发锦集(0):JSON.parse()和JSON.stringify()区别

项目中我们经常会使用JSON字符串转换,而且很频繁.所以总结如下,很简单的代码. 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>JSON.parse()和JSON.stringify()区别</title> 6 <script type="text/javascrip

J-Query开发锦集(3):appendTo()方法和append()方法

appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容. 提示:append() 和 appendTo() 方法执行的任务相同.不同之处在于:内容和选择器的位置,以及 append() 能够使用函数来附加内容. appendTo()方法代码展示: 1 <html> 2 <head> 3 <script type="text/javascript" src="/jquery/jquery.js"></script