个人笔记-设计模式之禅~设计原则(SOLID)

单一职责原则(Single Responsibility Principle SRP)的定义:应该有且仅有一个原因引起类的变更。

单一职责原则的好处:

类的复杂性降低,实现什么职责都有很清晰明了的定义。

提高可读性,降低复杂性。

提高可维护性、可读性。

降低变更引起的风险,一个接口修改只对相应的实现类有影响,对其他接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

注意:

单一职责原则提出的一个编写程序的标准,用"职责"或"变化原因"来衡量接口或类设计是否优良,但是"职责"和“变化原因”都是不可度量的,因项目、环境而异。

生搬硬套单一职责原则会引起类的剧增,给维护带来非常多的麻烦,而且过分细分类的职责也会人为地增加系统的复杂性。

对于单一职责原则,我的建议是接口一定做到单一职责,类的设计尽量做到有一个原因引起变化

什么是高内聚?高内聚就是提高接口、类、模块的处理能力,减少对外交互。

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

如果对每一个类型为S的对象o1,都有类型T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类。

只要父类能出现得到地方子类就可以出现,而且替换成子类也不会产生任何错误或者异常, 使用者根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必能适应。

子类必须完全实现父类方法

在类中调用其他类时务必要使用父类或者接口,如果不能使用父类或者接口,则说明累的设计违背了LSP原则。

如果子类不能完整实现父类方法,或者父类的某些方法在子类中发生了改变,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

覆盖或实现父类的方法时输入参数可以被放大

子类重载父类方法是,参数范围必须大于父类的范围

子类方法的前置条件必须与超类中被复写的方法的前置条件相同或者更宽松,否则在参数为超类时,传入子类超类的方法不会被执行(会执行子类方法)导致业务混乱。

依赖倒置原则

高层模块不应该依赖底层模块,两者都应该依赖其抽象。

模块之间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的

抽象不应该依赖细节

接口或者抽象类不依赖实现类

细节应该依赖抽象

实现类依赖接口或者抽象类

更加精简的定义是就是:面向接口编程

抽象是对实现的一种约束,对依赖者而言,也是一种契约,不仅仅约束自己,同时约束自己与外部的关系,保证细节不脱离契约的范畴。

遵循以下几个原则

每个类尽量都有接口或者抽象类,或者抽象类和接口两者具备

变量的表面类型尽量是接口或者抽象类

任何类都不应该从具体类派生(不超过两层)

尽量不要复写基类的方法

有点:

可以减少类之间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码可读性和可维护性。

接口隔离原则

建议单一接口,不要建立臃肿庞大的接口

模块的接口,需要专门提供,不要建立一个庞大臃肿的接口,容纳所有客户端访问。

接口要高内聚:提高接口的内部处理能力,减少对外交互。

接口划分的几个规则衡量:

一个接口只服务于一个字模块或者业务逻辑

通过业务逻辑压缩接口中的public方法,接口时常去回顾,尽量让接口达到“满身筋骨肉”的效果。

已经被污染的接口,尽量去修改,若变化风险较大,采用适配器模式进行转换处理。

了解环境,拒绝盲从。

接口隔离原则和其他设计原则一样,都需要花费较多的时间和精力进行设计和筹划,但是它带来了设计的灵活性。

迪米特法则

也称之为最小知识原则(Least Knowledge Principle LKP)一个对象应该对其他对象有最小的了解。

只与直接的朋友通信:例如组合、聚合、依赖等。朋友的定义:出现在成员变量、方法的输入输出参数中的称谓朋友类,而出现在方法体内部的类不属于朋友类。

一个方法,放在本类和放在其他类也可以。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。

在实际项目中需要适度考虑使用原则,别为套用原则而做项目。原则是用来参考的,如果违背了原则项目也未必会失败。

开闭原则

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

软件对扩展开发,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是修改已有的代码来实现变化。对修改关闭,并不意味着不做任何修改,低层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。

把可以变化归纳成以下三种类型

逻辑变化:只变化一个逻辑,而不涉及其他模块,例如原有A+B 改成A*B,可以通过修改原有方法完成,前提条件是:所有依赖或者关联类都按照相同的逻辑处理。

子模块变化:一个模块变化,会对其他模块产生影响,特别是低层模块的变化,必然会引起高层模块的变化。

可见视图变化:可见视图是提供客户使用的界面,该部分的变化一般会引起连锁反应。例如:一个展示数据列表,按照原有的需求是N列,突然有一天要增加1列,而且这列数据需要跨N张表,处理M个逻辑才能实现,这样的变化就比较恐了。程序设计比较灵活,可以通过扩展来完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • [TOC] 单一设计原则---(专人专事) 单一职责原则的定义是:应该有且仅有一个原因引起类的变更。 优化:重新拆...
    古都旧城阅读 582评论 0 1
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,743评论 3 13
  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 763评论 0 1
  • 转载标注声明:http://www.uml.org.cn/sjms/201211023.asp 目录:[设计模式六...
    Bloo_m阅读 704评论 0 7
  • 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 ...
    Jabir_Zhang阅读 639评论 0 3