软件设计七大原则

软件设计中,怎样提高系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。面向对象设计原则是实现可维护性和可复用性的基础,每一个原则都蕴含了面向对象设计的思想,可从不同的视角提升一个软件结构的设计水平。这些原则蕴含着很多设计模式中,也是我们用于评价一个设计模式使用效果的重要指标之一。

1, 开放封闭原则

就是对扩展开放,而对修改封闭。其是所有面向对象原则的核心。软件设计追求的是易于扩展复用、封装实现细节、降低耦合度,开放封闭原则是实现这一目标的最直接的体现。(1)开放,对功能或需求的扩展开放,当有新需求或变化时,可依据现有的程序代码进行扩展,以便适应新要求;(2)封闭,意味着一旦设计完成,便可以独立工作,不能对其进行任何的修改。

2, 单一职责原则

很好理解,一个类只负责一项职责。针对一个类,其承担的职责越多,被复用的可能性就越小。如果类承担的职责很多,就意味着这些职责耦合在了一起,若其中一项职责发生变化,就可能会影响其他职责的处理。

3, 里式替换原则

里氏代换原则是由2008年图灵奖得主、美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学JeannetteWing教授提出,其严格的表述为:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。这种描述让人非常难以理解,换一句更通俗易懂的解释就是:所有基类出现的地方,都可以使用子类进行替换,子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说基类对象出现的地方,子类对象一定可以出现,但反过来则不行。比如我喜欢车子,那么意味着我喜欢自行车,但反过来就不一定,因为我喜欢自行车并不代表就喜欢所有的车子。

4, 接口隔离原则

有两项含义:(1)客户需要什么样的接口,就提供什么样的接口,不需要的就删除掉;(2)类之间的依赖关系应建立在最小的接口上。也就是说,接口中的方法要尽量的少,接口功能要尽量的细分。

5, 依赖倒置原则

依赖倒转原则就是要依赖于抽象,不要依赖于实现。高层模块不依赖于底层模块,二者都依赖其抽象;抽象不依赖于细节,细节应该依赖抽象。(Abstractions should not depend upon details. Details should depend uponabstractions.)要针对接口编程,不要针对实现编程。(Program to an interface, not an implementation.)也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。而不要用具体类进行变量的类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。要保证做到这一点,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法。

传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块,抽象层次依赖于具体层次。倒转原则就是把这个错误的依赖关系倒转过来。

面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化,具体化给出不同的实现。继承关系就是一种从抽象化到具体化的导出。

抽象层包含的应该是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现。具体层次含有的是一些次要的与实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是经常变动的,不能避免出现错误。

从复用的角度来说,高层次的模块是应当复用的,而且是复用的重点,因为它含有一个应用系统最重要的宏观商务逻辑,是较为稳定的。而在传统的过程性设计中,复用则侧重于具体层次模块的复用。

依赖倒转原则则是对传统的过程性设计方法的“倒转”,是高层次模块复用及其可维护性的有效规范。

特例:对象的创建过程是违背“开—闭”原则以及依赖倒转原则的,但通过工厂模式,能很好地解决对象创建过程中的依赖倒转问题。

   此文引用自:http://www.cnblogs.com/temptation/archive/2008/03/10/1098351.html

6, 迪米特法则

迪米特法则,也可称为最少知识原则。一个类对自己所依赖的类知道的越少越好,对于被依赖的类,不论其实现逻辑如何,都将这些逻辑封装在自己的范围内,对外通过public(protected可以通过子类访问)方法进行提供服务,否则不对外泄露任何信息,这也体现了数据保密性。

7, 组合/聚合复用原则

简单的说是,尽量使用对象的组合/聚合,而不是继承来达到复用的目的。

组合和聚合都是对象建模中关联关系的一种。聚合表示整体与部分的关系,表示“含有”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。在合成关系中,部分和整体的生命周期一样,组合的新的对象完全支配其组成部分,包括他们的创建和销毁。一个合成关系中成分对象是不能与另外一个合成关系共享。

   组合/聚合和继承是实现代码复用的两种基本途径,在设计过程中尽量使用组合/聚合,而不是继承。因为继承使得基类与子类有较强的耦合性,通常情况下基类的内部细节对子类来说是可见的,这样基类的实现细节会暴露给子类,破坏了系统的封装性。



   开闭原则是所有面向对象原则的核心;里式替换原则是实现开闭原则的重要方式之一;依赖倒置原则是系统抽象化的具体实现,其是面向对象设计的主要实现机制之一;接口隔离原则要求接口的方法尽量少,接口尽量细化;迪米特法则降低系统的耦合度,其使得一个模块的修改尽量少的影响其他模块,扩展会相对容易;在软件设计中,尽量使用组合/聚合而不是继承达到代码复用的目的。

关于设计原则的介绍有很多,在此推荐以下链接:

开闭原则:http://blog.csdn.net/lovelion/article/details/7537584

单一职责原则:http://blog.csdn.net/lovelion/article/details/7536542

里式替换原则:http://blog.csdn.net/lovelion/article/details/7540445

接口隔离原则:http://blog.csdn.net/lovelion/article/details/7562842

依赖倒置原则:http://blog.csdn.net/lovelion/article/details/7562783

迪米特法则:http://blog.csdn.net/lovelion/article/details/7563445

组合/聚合原则:http://blog.csdn.net/lovelion/article/details/7563441

设计模式六大原则:http://www.uml.org.cn/sjms/201211023.asp

作者:lixg88888888
来源:CSDN
原文:https://blog.csdn.net/lixg88888888/article/details/78932142
版权声明:本文为博主原创文章,转载请附上博文链接!

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

推荐阅读更多精彩内容

  • 1.开闭原则 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节解释:当我们有...
    ddxuzengbin阅读 1,647评论 1 1
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,734评论 0 14
  • 看《多桑》的时候并没有那么大的耐心,特别是模糊的画质和并不清闲冷静的心情,以及印象中像杨德昌、侯孝贤那类台湾电影里...
    弓谷所長阅读 617评论 0 2
  • 这两天在Cornerstone代码合并中出了些错误,所以集中学习了一下。 项目导入 基本使用 有关分支和tag暂时...
    wpf_register阅读 217评论 1 1
  • 要想实现财富自由,就是再也不要出售自己的时间了。 这句话是真的能背下来了。可是在到达财富自由之前,我们唯一能做的还...
    一亿小目标阅读 271评论 0 2