软件设计模式的意义

软件设计模式的意义

所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。

为什么好像只能从框架中找到设计模式的应用示例,而实施项目中很少看到?

是项目太简单了,用不着;是技术人员水平太差了,不会写;以业务价值最优先,先实现功能,设计不重要;设计做的费时费力也看不到,没有绩效,没意义。

上面这些理由都是现实项目中实实在在的理由,并不仅仅是面对询问时的借口,而是很多开发人员的真是想法。无需列举各种各样的数据,以及一条条的格言来证明设计模式是多么多么的重要,能带来多么多么好的效果。即使引经据典写了很多,最终的结果可能就是屏幕上的一划而过。甚至对设计模式是否有必要学习都持怀疑太多,认为这些都是八股文,看了也就是为了面试。

下面是对软件设计模式的意义的一些个人看法,有不同看法的恳请交流和指教。

设计模式的底层思维

设计模式的是建立在面向对象的思维基础上的。面向对象设计中最重要的就是抽象和封装。设计模式的目的为了在满足需求的前提下,做到不破坏或则提供更好的封装性的同时提供扩展性,也就是常说的对修改封闭对扩展开放的开闭原则。

《系统架构:复杂产品的设计与开发》中提到系统设计的第一要点: 识别并隔离系统的稳定点和变化点,比如Linux的内核层和用户层。 很多软件设计模式的核心目的也是分隔稳定点和变化点,提供一种灵活实现变化点带来的扩展性以及不破坏稳定部分代码(不破话封装)的带来的可靠性。也就是常常说的解耦

设计模式讲述的是特定需求场景下的某种模式,源自对系统设计的思考。 只有有了系统设计的思维,真正的去思考系统的稳定点和变化点时,才有设计模式存在的意义。如果有了这个想法,那么恭喜你,开始从纯粹的开发人员转变为系统设计师角色了。

       要理解设计模式的意义,首先思维上要从开发人员转变为设计人员。

设计师和资深施工人员的争论

有一个调侃词: 反人类的设计。 指的是那些偏离了实际的实施环境的设计。如下图: 一个不透明的带刻度的杯子。

软件设计模式的意义

所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。

为什么好像只能从框架中找到设计模式的应用示例,而实施项目中很少看到?

是项目太简单了,用不着;是技术人员水平太差了,不会写;以业务价值最优先,先实现功能,设计不重要;设计做的费时费力也看不到,没有绩效,没意义。

上面这些理由都是现实项目中实实在在的理由,并不仅仅是面对询问时的借口,而是很多开发人员的真是想法。无需列举各种各样的数据,以及一条条的格言来证明设计模式是多么多么的重要,能带来多么多么好的效果。即使引经据典写了很多,最终的结果可能就是屏幕上的一划而过。甚至对设计模式是否有必要学习都持怀疑太多,认为这些都是八股文,看了也就是为了面试。

下面是对软件设计模式的意义的一些个人看法,有不同看法的恳请交流和指教。

设计模式的底层思维

设计模式的是建立在面向对象的思维基础上的。面向对象设计中最重要的就是抽象和封装。设计模式的目的为了在满足需求的前提下,做到不破坏或则提供更好的封装性的同时提供扩展性,也就是常说的对修改封闭对扩展开放的开闭原则。

《系统架构:复杂产品的设计与开发》中提到系统设计的第一要点: 识别并隔离系统的稳定点和变化点,比如Linux的内核层和用户层。 很多软件设计模式的核心目的也是分隔稳定点和变化点,提供一种灵活实现变化点带来的扩展性以及不破坏稳定部分代码(不破话封装)的带来的可靠性。也就是常常说的解耦

设计模式讲述的是特定需求场景下的某种模式,源自对系统设计的思考。 只有有了系统设计的思维,真正的去思考系统的稳定点和变化点时,才有设计模式存在的意义。如果有了这个想法,那么恭喜你,开始从纯粹的开发人员转变为系统设计师角色了。

       要理解设计模式的意义,首先思维上要从开发人员转变为设计人员。

设计师和资深施工人员的争论

有一个调侃词: 反人类的设计。 指的是那些偏离了实际的实施环境的设计。如下图: 一个不透明的带刻度的杯子。

制造业中已经形成了高度的分工,设计和实施通常是分开的, 而在软件实施中, 产品研发很多情况下还是同一个团队完成设计和编码,采购软件产品或服务时,也通常是由供应商全部完成软件的设计和实施。再加上系统功能测试,最终用户看到的交付版本看起来都是满足用户需求的设计和实现。 Everything is OK!

那软件产品里面都有设计吗?答案是不一定。

很多小工坊模式的实体产品生产并不需要设计,或根据经验,或所谓的山寨就可以生产出各式各样的产品。 软件开发也一样。很多时候是由经验丰富的软件开发人员根据自身经验独自完成整个项目或功能的构建,本应该出现的设计评审往往由于项目规模和定位,甚至是由于对敏捷开发的误会,追求最快的产品迭代等各种原因而省略了(当然项目交付汇报时依然是要有设计阶段的哈)。

这里有常见争议点:在有限的复杂度下,既然程序员都能够自行完成项目,还有必要增加设计人员或者说设计流程吗?设计人员的产出有资深程序员的经验更优秀吗?

答案见仁见智的。个人认为还是必要的,软件产品尤其是企业信息化软件和实体产品的有一个本质区别:企业信息化软件是永远处于变化中的。实体产品生产出来后就没法改变了, 如果需要修改则需要重新设计, 开模。 而开模的费用是昂贵的,而且已经生产的产品也只能丢弃了,人们能看得到设计不完善带来的代价,因此通常都会有明确的设计环节,即使是再小的零件都有图纸,由车间工人按照图纸进行加工。企业信息化软件伴随着企业规模,流程以及业务的调整需要持续的变更,也因此带来了IT、软件二开等相关的工作(感恩珍贵的工作岗位)。从需求用户的角度,软件天生就应该可以持续修改的,运维和二开的开始阶段往往是可以很快满足变更需求的,也更加深了软件可以轻易修改的假象。

系统软件开发是减少混乱度的过程,所以它本身是处于亚稳定状态的。软件维护是提高混乱度的过程,即使是最熟练的软件维护工作,也只是放换了系统退化到非稳态的进程。--《人月神话》

直到有一天,维护人员发现整个产品都变成了一个“大泥球”,即使是一个看起来很简单的需求变更实施的代价都是巨大甚至是不可完成的。因此在各方决策人员的讨论下做出了下面的结论:“当前软件架构上落后了,无法满足我们的业务需求了,我们需要重新实施新的项目来满足企业运营需求”。 于是如同轮回一般开始了新的技术产品选型、供应商选择、实施、成功上线。但似乎很难回答上个产品的架构是哪里不能满足需求了。

回到上面没有看到软件设计模式的前面2个理由:

  1. 是项目太简单了,用不着: 这个理由当然是不成立的,但是这里强调的是作为开发人员自身思想上必须正视这种错误的观念。从开发管理和软件工程的角度,这个理由从来没有存在过。
  2. 是技术人员水平太差了,不会写: 这个理由是真实的,尤其是企业信息化软件人力外包的场景下,真实的编码人员往往连项目经验都无法保障,更别说能形成设计思维了。这个问题的解决不在于这些开发人员,需要有专门的leader或资深员工从编码工作中解放出来负责设计,这些角色也应该真正正式软件设计的重要性,而不仅是开发管理。如果都是一肩挑那那就寄希望于开发人员能够有设计的思维,认识到设计工作的客观存在性了。

总结

软件设计很重要,因此软件设计模式很重要,开发人员如果不知从何开始设计,可以通过先思考确定系统功能(业务)的稳定点和变化点,在结合了解的设计模式去选择最佳实践开始。

软件设计模式对开发人员实在的好处

软件设计模式是一门沟通工具,能够给开发人员带来的下面真真切切的好处:

  1. 模式项目协作沟通工具。开发人员的沟通语言就是模式,可以通过设计模式的去和业务、BA沟通编码的设计,当面对不够详细的需求文档时,不如使用软件设计模式来和BA讲解自己的设计思路,明确真正的需求。
  2. 设计模式是技术人员之间的沟通工具。设计模式对阅读开源框架源码、理解第三方产品有莫大的好处。比如:你看到了xxxxBuilder的类, 通常是构造器模式,也就明白了这个类的目的就是构造特定对象, 其他类似典型的xxxFactory, xxxVisitor, xxxAdaptor, xxxEventListener等。同理,我们自己开发的代码是如果能使用模式,遵照模式去定义类,也能够极大的提升自身代码的质量和可阅读性。
  3. 设计模式是汇报的工具。模式也是表达开发产出的最佳方式:契合业务需求的设计模式通常是最佳实践,能在满足需求的情况下提供更好的扩展性和灵活性,是最能表达开发产出和开发人员能力的工具。当然也能很好的向领导汇报工作。

制造业中已经形成了高度的分工,设计和实施通常是分开的, 而在软件实施中, 产品研发很多情况下还是同一个团队完成设计和编码,采购软件产品或服务时,也通常是由供应商全部完成软件的设计和实施。再加上系统功能测试,最终用户看到的交付版本看起来都是满足用户需求的设计和实现。 Everything is OK!

那软件产品里面都有设计吗?答案是不一定。

很多小工坊模式的实体产品生产并不需要设计,或根据经验,或所谓的山寨就可以生产出各式各样的产品。 软件开发也一样。很多时候是由经验丰富的软件开发人员根据自身经验独自完成整个项目或功能的构建,本应该出现的设计评审往往由于项目规模和定位,甚至是由于对敏捷开发的误会,追求最快的产品迭代等各种原因而省略了(当然项目交付汇报时依然是要有设计阶段的哈)。

这里有常见争议点:在有限的复杂度下,既然程序员都能够自行完成项目,还有必要增加设计人员或者说设计流程吗?设计人员的产出有资深程序员的经验更优秀吗?

答案见仁见智的。个人认为还是必要的,软件产品尤其是企业信息化软件和实体产品的有一个本质区别:企业信息化软件是永远处于变化中的。实体产品生产出来后就没法改变了, 如果需要修改则需要重新设计, 开模。 而开模的费用是昂贵的,而且已经生产的产品也只能丢弃了,人们能看得到设计不完善带来的代价,因此通常都会有明确的设计环节,即使是再小的零件都有图纸,由车间工人按照图纸进行加工。企业信息化软件伴随着企业规模,流程以及业务的调整需要持续的变更,也因此带来了IT、软件二开等相关的工作(感恩珍贵的工作岗位)。从需求用户的角度,软件天生就应该可以持续修改的,运维和二开的开始阶段往往是可以很快满足变更需求的,也更加深了软件可以轻易修改的假象。

系统软件开发是减少混乱度的过程,所以它本身是处于亚稳定状态的。软件维护是提高混乱度的过程,即使是最熟练的软件维护工作,也只是放换了系统退化到非稳态的进程。--《人月神话》

直到有一天,维护人员发现整个产品都变成了一个“大泥球”,即使是一个看起来很简单的需求变更实施的代价都是巨大甚至是不可完成的。因此在各方决策人员的讨论下做出了下面的结论:“当前软件架构上落后了,无法满足我们的业务需求了,我们需要重新实施新的项目来满足企业运营需求”。 于是如同轮回一般开始了新的技术产品选型、供应商选择、实施、成功上线。但似乎很难回答上个产品的架构是哪里不能满足需求了。

回到上面没有看到软件设计模式的前面2个理由:

  1. 是项目太简单了,用不着: 这个理由当然是不成立的,但是这里强调的是作为开发人员自身思想上必须正视这种错误的观念。从开发管理和软件工程的角度,这个理由从来没有存在过。
  2. 是技术人员水平太差了,不会写: 这个理由是真实的,尤其是企业信息化软件人力外包的场景下,真实的编码人员往往连项目经验都无法保障,更别说能形成设计思维了。这个问题的解决不在于这些开发人员,需要有专门的leader或资深员工从编码工作中解放出来负责设计,这些角色也应该真正正式软件设计的重要性,而不仅是开发管理。如果都是一肩挑那那就寄希望于开发人员能够有设计的思维,认识到设计工作的客观存在性了。

总结

软件设计很重要,因此软件设计模式很重要,开发人员如果不知从何开始设计,可以通过先思考确定系统功能(业务)的稳定点和变化点,在结合了解的设计模式去选择最佳实践开始。

软件设计模式对开发人员实在的好处

软件设计模式是一门沟通工具,能够给开发人员带来的下面真真切切的好处:

  1. 模式项目协作沟通工具。开发人员的沟通语言就是模式,可以通过设计模式的去和业务、BA沟通编码的设计,当面对不够详细的需求文档时,不如使用软件设计模式来和BA讲解自己的设计思路,明确真正的需求。
  2. 设计模式是技术人员之间的沟通工具。设计模式对阅读开源框架源码、理解第三方产品有莫大的好处。比如:你看到了xxxxBuilder的类, 通常是构造器模式,也就明白了这个类的目的就是构造特定对象, 其他类似典型的xxxFactory, xxxVisitor, xxxAdaptor, xxxEventListener等。同理,我们自己开发的代码是如果能使用模式,遵照模式去定义类,也能够极大的提升自身代码的质量和可阅读性。
  3. 设计模式是汇报的工具。模式也是表达开发产出的最佳方式:契合业务需求的设计模式通常是最佳实践,能在满足需求的情况下提供更好的扩展性和灵活性,是最能表达开发产出和开发人员能力的工具。当然也能很好的向领导汇报工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes(5) 续4

目录 volumes emptyDir卷 hostpath卷 nfs卷 持久卷 storageclass statefulset控制器 mysql主从部署 volumes emptyDir卷 [rootk8s2 volumes]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata:name: vol1 spec:containers:- image: busyboxplusname: vm1command: ["…

3D视觉引导纸箱拆码垛,助力物流行业转型升级

近年来,自动化和智能化技术在各行业的应用越来越广泛,特别是在物流和仓储领域。纸箱拆码垛是物流仓储中的一个重要环节。 人工分拣效率低、错误率高、成本高,传统的拆码垛设备存在兼容性差,对纸箱的识别率不高、操作不灵活等问题…

jsp多层弹框,让弹框出现在最外层,最顶层

如下图所示,给该弹框添加样式,z-index:5 这个值要比已经弹出的弹框的值大,

Next.js 项目——从入门到入门(Eslint+Prettier)

Next.js官方文档地址 什么是 Next.js 这是一个用于生产环境的 React 框架。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配置。 功能: 功能说…

Ubuntu 18.04.6 LTS安装docker和docker-compose、镜像导入导出

Ubuntu 18.04.6 LTS安装docker和docker-compose、镜像导入导出 文章目录 Ubuntu 18.04.6 LTS安装docker和docker-compose、镜像导入导出安装docker更新数据源,安装必要插件添加GPG密钥设置存储库再更新apt包索引安装docker-ce查看docker状态运行docker hello-world …

Gin学习笔记

Gin学习笔记 Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin 1、快速入门 1.1、安装Gin go get -u github.com/gin-gonic/gin1.2、main.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 创建路由引…

LeetCode 热题100——链表专题(二)

一、环形链表 141.环形链表(题目链接) 思路:使用快慢指针,慢指针走一步,快指针走俩步,如果是环形链表,那么快慢指针一定相遇,如果不是环形结构那么快指针或者快指针的next一定先为N…

概率论和数理统计(一)概率的基本概念

前言 生活中对于事件的发生,可以概括为 确定现象:在一定条件下必然发生,如日出随机现象:在个别试验中其结果呈现出不确定性,在大量重复试验中其结果又具有统计规律的现象,称之为随机现象。 随机现象的特点&#xff…

TCP/IP的基础知识

文章目录 TCP/IP的基础知识硬件(物理层)网络接口层(数据链路层)互联网层(网络层)TCP/IP的具体含义传输层应用层(会话层以上的分层)TCP/IP分层模型与通信示例发送数据包的一个例子接收…

【公益案例展】火山引擎公益电子票据服务——连接善意,共创美好

‍ 火山引擎公益案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 捐赠票据是慈善组织接受捐赠后给捐赠方开具的重要凭证&…

Mybatis与Mybatis-Plus(注解与Xml)(单表与多表)

准备工作 这里我们准备了两个与数据库表对应的实体类,stu为学生表,cls为班级表 类属性上的注解如 TableId等 为Mybatis-Plus的注解,使用mybatis会无视掉这些注解 在Stu 类的最后一个属性我们定义了Cls实体类的对象,对于单表查询&…

Dcoker学习笔记(一)

Dcoker学习笔记一 一、 初识Docker1.1 简介1.2 虚拟机和docker的区别1.3 Docker架构1.4 安装Docker(Linux) 二、 Dcoker基本操作2.1 镜像操作2.2 容器操作练习 2.3 数据卷volume(容器数据管理)简介数据卷语法数据卷挂载 2.4 自定义…

高性能三防工业平板电脑 防摔防爆电容屏工控平板

HT1000是一款高性能工业三防平板,10.1英寸超清大屏,厚度仅14.9mm,超薄机身,可轻松插入袋中,方便携带,搭载8核2.0GHz高性能CPU,行业领先的Android 11.0,设备性能大幅提升,…

机器人制作开源方案 | 管内检测维护机器人

一、作品简介 作者:李泽彬,李晋晟,杜张坤,禹馨雅 单位:运城学院 指导老师:薛晓峰 随着我国的社会主义市场经济的飞速发展和科学技术的革新,各行各业的发展越来越离不开信息化和网络化的…

【深度学习】卷积层填充和步幅以及其大小关系

参考链接 【深度学习】:《PyTorch入门到项目实战》卷积神经网络2-2:填充(padding)和步幅(stride) 一、卷积 卷积是在深度学习中的一种重要操作,但实际上它是一种互相关操作,,首先我们来了解一下二维互相关&#xff…

ros1 自定义topic 主题的发布,监听以及和消息体的定义

1. 在功能包下新增msg 文件夹 在功能包的下面新建 msg 文件夹,如下图所示 2. 新增Person.msg 消息实体 右键打开命令框,输入 touch Person.msg 就会在msg 目录下新增 Person.msg 文件 在Person.msg中输入如下内容完成.msg文件的创建,msg文…

关于卷积神经网络中如何计算卷积核大小(kernels)

首先需要说明的一点是,虽然卷积层得名于卷积( convolution )运算,但我们通常在卷积层中使用更加直观的计算方式,叫做互相关( cross-correlation )运算。 也就是说,其实我们现在在这里…

安装 Node.js

首先,我们需要安装 Node.js 和相关的库,如 request 和 cheerio。 npm install request cheerio然后,我们可以使用以下代码来爬取网页内容: const request require(request); const cheerio require(cheerio);request({url: js…

基于ubuntu1604的ROS安装

不同版本的Ubuntu都有对应的ROS版本,不要强行安装不对应的版本,否则遇到问题会很难找到解决方法。此教程也只是基于Ubuntu1604和kinetic版本的ROS。 一、基本流程 以下命令仅记录执行顺序,不要无脑复制执行,重在理解 #基本更新…

Linux学习第35天:Linux LCD 驱动实验(二):星星之火可以燎原

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、LCD驱动程序编写 需要注意的地方: ①、 LCD 所使用的 IO 配置。 ②、 LCD 屏幕节点修改,修改相应的属性值,换成我们所使…