软件设计原则这个话题看上去很大,乍一看确实不小,但是如果仔细去分析的话可以发现这些原则其实就是为了避免一些问题而提出的一些建议,这些建议呢普遍使用于软件的各个领域,所以给这些建议提高了一个档次就叫做原则了,哈哈,纯属本人理解。

首先,为什么要有软件设计原则?软件设计原则的目的是为了让我们编写出更好的代码,那什么是“更好的代码”?“更好的代码”就是使代码更简洁、更易读、更具有可维护性以及更具有可扩展性。那么我们写代码或者设计代码结构的时候不遵循软件设计原则可以吗?答案是可以的。因为软件设计原则不像是Java语法一样的硬性要求,不这么做编译就不通过,你的程序就运行不了,相反,不遵循这七大设计原则你的代码照样能够运行。那么所谓的设计原则就是在大量的工程实践的基础上以及科学研究的基础上总结出来的一些经验和理念,我们在设计以及编写代码的过程中要尽量地借鉴前人的一些好的经验来使我们自己少走弯路,这也是软件设计原则的意义所在。

那么软件设计的过程中有哪七大原则呢?分别是开闭原则(Open-Closed Principle,OCP)、依赖倒置原则(Dependence Inversion Principle,DIP)、单一职责原则(Simple Responsibility Pinciple,SRP)、接口隔离原则(Interface Segregation Principle,ISP)、迪米特原则(Law of Demeter,LoD)、里氏替换原则(Liskov Substitution Principle,LSP)和合成复用原则(Composite/Aggregate Reuse Principle,CARP)。下面就逐一介绍一下。

一、开闭原则(Open-Closed Principle,OCP)

开闭原则即对扩展开放对修改关闭,即用扩展而不是修改来适应需求的变化。我们知道系统在正式发布上线之后如果去修改既有代码那么可能会引入一些风险,比如我们修改A功能的代码可能会使既有的B功能受到影响,如果控制不当的话就会出现A功能符合了新需求的变化但同时B功能出问题了,所以我们要进行回归测试来最大限度地降低这种风险的存在。那么开闭原则就是针对类似这种现象而提出来的,并且这个原则是其他六个设计原则的基础,或者说其他六个设计原则是开闭原则在不同方面的实现。

我们来举一个例子来说明开闭原则:张三买了一辆宝马,然后就开这辆宝马。我们来看一下代码实现:

这样看没有任何问题。现在需求变更了:张三不开宝马了,改成开奔驰了。那如果不遵循OCP就得将Person类里面的drive方法的入參由BMW改成Benz:

在调用方(main方法)也要跟着改:

也就是说如果张三不停地换车,代码从上到下都要频繁地跟着改,前面说过更改既有的代码意味着引入风险。所以,就要用OCP来约束这种情况的发生。看以下代码的改造:

调用方面向接口编程或者抽象编程:

这样无论张三再怎么换车,调用方(main方法)和Person类的drive方法都不需要跟着修改了,只需要在入口处注入不同品牌车的实例即可,这样一来代码就灵活了,扩展性就强了。平时我们说的面相接口编程或者面相抽象编程其实就是对OCP原则的一种应用。所以要深刻理解这句话——用扩展来适应需求的变化而不是用修改来适应变化,这就是OCP。

二、依赖倒置原则(Dependence Inversion Principle,DIP)

在介绍依赖倒置原则之前先说两个概念和一个前提。这两个概念是高层模块和底层模块,高层模块就是服务的调用方,底层模块就是服务的提供方。前提就是基于一个事实:抽象层的东西是不经常变动的,实现是经常会变动的,如果抽象层的东西经常变动的话那么所说的这些原则都没有什么意义了。

DIP说得正式一点就是:高层模块不依赖于低层模块,二者应依赖其(低层模块)抽象;抽象不依赖于细节,细节应依赖于抽象。说这些可能不太好理解,其实说白了DIP就解决一件事情——如何让高层模块不随着低层模块的变化而变化,换句话说就是无论服务提供者怎么变,只要接口不变那么服务调用方就不会变。什么意思?还是拿上面OCP的例子来举例。

main方法作为调用方是高层模块,BMW或者Benz是具体的实现为低层模块,那么在main方法里面直接new一个BMW出来就将高层模块和低层模块直接产生了关联也就是直接耦合在了一起,如果需求发生变更:张三不开宝马了改成了开车奔驰,那么调用方第31行代码必须作出修改:将new BMW()改成new Benz()。那么如何解决低层模块的变化不影响到高层模块呢?就是二者共同依赖低层模块的抽象ICar——调用者面向接口ICar编程,这样张三在换车的时候注入进来新车的实例即可而无需做任何改动。最后我们可以看到张三换车这个例子不仅很好地解释了OCP原则也很好地解释了DIP原则,所以这里也要很好地感谢张三频繁地换车

浅谈软件设计的七大原则相关推荐

  1. 设计模式 - 软件设计的七大原则

    文章目录 前言 1. 软件设计模式原则 2. 开闭原则 1. 概念 2. 例子 3. 里氏替换原则 1. 概念 2. 例子 4. 依赖倒置原则 1. 概念 2. 代码 5. 单一职责原则 说明 6. ...

  2. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

  3. 【设计模式系列24】GoF23种设计模式总结及软件设计7大原则

    设计模式总结及软件设计七大原则 设计模式系列总览 前言 软件设计7大原则 开闭原则(Open-Closed Principle,OCP) 里氏替换原则(Liskov Substitution Prin ...

  4. 浅谈数据库设计技巧(上)

    浅谈数据库设计技巧(上) 说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡 ...

  5. 深入理解面向对象设计的七大原则

    一.面向对象设计的七大原则是什么? 1.开放封闭原则 2.里氏转换原则 3.依赖倒转原则 4.组合/聚合原则 5.接口隔离原则 6."迪米特"法则 7.单一职责原则 二.七大原则是 ...

  6. 软件架构设计_架构师内功心法,软件架构设计的七大原则精选案例

    一.软件架构设计的七大原则简介 1.1 开闭原则(Open-Closed Principle,OCP) 开闭原则是一个软件实体如类.模块和函数应该对扩展开放,对修改关闭.所谓的开闭也是对扩展和修改两个 ...

  7. 浅谈软件开发工具CASE在软件项目开发中发挥的作用认识

    浅谈软件开发工具CASE在软件项目开发中发挥的作用认识 内容摘要:阐述了CASE工具作为 一种开发环境在软件项目开发中所起到的开发及管理作用.CASE工具实际上是把原先由手工完成的开发过程转变为以自动 ...

  8. java学习方法-浅谈软件开发的神速进步

    中国人大都喜欢用武侠小说来比较软件开发,但是在实战武功中,只有葵花宝典才是最厉害的,也只有掌握了葵花宝典,才能称为"不败". 1浅谈软件开发的神速进步 1.1什么才是软件开发的葵花 ...

  9. 面向对象设计的七大原则 (包括SOLID原则)

    文章目录 概述 1. 单一原则 2. 里氏替换原则 3. 依赖倒转原则 4. 接口分隔原则(Interface Segregation Principle ,ISP) 5. 迪米特法则 (Law of ...

最新文章

  1. [Android]文本框实现搜索和清空效果
  2. equalsignorecase用法
  3. html区块位置怎么设置,HTML 区块
  4. 深度学习笔记(27) 经典卷积网络
  5. 使用d3.v3插件绘制出svg图
  6. 元素赋值、增加元素和删除元素
  7. 美国西海岸php,美国西海岸大学top 14
  8. Android基础篇1:Activity
  9. Ubuntu16.04安装PyQt5教程(百度网盘)
  10. 如何将多张二维码合成一个新的动态二维码进行随机扫码
  11. 嵌入式Linux--使用libpng库解码png图片
  12. Rhino导入Revit生成体量幕墙的方法和操作要点
  13. Windows开启卓越性能模式,一键睿频
  14. 双目摄像头相关参数介绍
  15. 计算机主机核心通常包括,计算机的主机主要包括什么
  16. Frank-Cucumber - Core Frank Steps
  17. SOC上的总线真的是总线?
  18. 复旦大学教授肖仰华:ChatGPT 浪潮下,面向大模型如何做数据治理?
  19. Linux Python 导航目录
  20. 腾讯企业邮箱单点登录无需帐号密码

热门文章

  1. 杭州UI设培训学校哪家好
  2. 【今日早报】2019/06/17
  3. CVS 常用操作命令
  4. 为什么阿里巴巴天天招人,但又很难进,真的缺人吗?
  5. python炫酷动画源代码_Python小技巧:如何用Python代码发一个炫酷的朋友圈
  6. 【查找】临近省赛,Alan邀请emoji玩起了猜数字游戏活跃一下大脑。游戏规则如下:首先Alan写下几个数字让emoji猜,当emoji猜完之后,Alan会给他一个提示(java)
  7. 支付宝五福java_2021年集支付宝五福攻略 一个账号一天最少扫到10张+ 扫一轮下来 基本要啥福有啥福!...
  8. python批量发送工资条邮件
  9. Python代码编译,py文件编译为pyc文件
  10. linux多进程的日志记录实现,Linux守护进程的日志实现