从七十年代到现在软件架构的思想变化

本文回顾了软件架构的发展历程,从结构化程序设计、面向对象编程到设计模式、设计原则、领域驱动设计、DCI架构模式、领域专用语言和微服务架构。每个阶段都体现了对软件复杂性的管理和应对策略的改进,以适应不断变化的软件开发需求和环境。
摘要由CSDN通过智能技术生成

目录

一、序言

二、结构化程序设计

三、面向对象程序设计

四、设计模式

五、设计原则

六、领域驱动设计

七、DCI架构模式

八、领域专用语言

九、微服务架构模式

十、小结


一、序言

20世纪60年代以前,计算机刚刚投入实际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制,采用密切依赖于计算机的机器代码或汇编语言,软件的规模比较小,文档资料通常也没有,很少使用系统化的开发方法,设计软件往往等同于编制程序,基本上是自给自足的私人化的软件生产方式。

 

20世纪60年代中期,大容量、高速度计算机的出现,使得计算机的应用范围迅速扩大,软件开发急剧增长。高级语言逐渐流行(FORTRAN 66),操作系统开始发展(IBMSYS),第一代数据库管理系统慢慢诞生(IMS),软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。

 

既有自给自足的私人化的软件生产方式不能再满足要求,迫切需要改变,于是软件危机开始爆发,即落后的软件生产方式无法满足迅速增长的计算机软件需求,导致软件的开发与维护出现一系列严重的问题:

🔷  软件开发费用和进度失控

🔷  软件的可靠性差

🔷  生产出来的软件难以维护

 

1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,第一次讨论软件危机问题,并正式提出“软件工程”一词,从此一门新兴的工程学科应运而生。

 

二、结构化程序设计

结构化程序设计由迪克斯特拉(E.W.dijkstra)在1969年提出,是以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,这样使完成每一个模块的工作变单纯而明确,为设计一些较大的软件打下了良好的基础。


由于模块相互独立,因此在设计其中一个模块时,不会受到其它模块的牵连,因而可将原来较为复杂的问题化简为一系列简单模块的设计。模块的独立性还为扩充已有的系统和建立新系统带来了不少的方便,因为我们可以充分利用现有的模块作积木式的扩展。


按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合: 顺序结构、选择结构和循环结构来实现。

 

结构化程序设计主要表现在一下三个方面:

 

1、自顶向下,逐步求精。将编写程序看成是一个逐步演化的过程,将分析问题的过程划分成若干个层次,每一个新的层次都是上一个层次的细化。

2、模块化。将系统分解成若干个模块,每个模块实现特定的功能,最终的系统由这些模块组装而成,模块之间通过接口传递信息。

3、语句结构化。在每个模块中只允许出现顺序、分支和循环三种流程结构的语句。

 

结构化程序设计的概念、方法和支持这些方法的一整套软件工具,构成了结构化革命。这是计算机问世以来对计算机界影响最大的一个软件概念,被称为软件发展中的第三个里程碑,其影响比前两个里程碑(子程序、高级语言)更为深远。

 

1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。1973年初,C语言的主体开发完成,并逐步成为结构化编程语言中最流行的语言。

 

尼古拉斯沃思(Nicklaus Wirth)教授在编程界提出了一个著名的公式:程序 = 数据结构 + 算法


结构化程序设计是用计算机的思维方式去处理问题,将数据结构和算法分离。数据结构描述待处理数据的组织形式,而算法描述具体的操作过程。我们用函数把这些算法一步一步的实现,使用的时候一个一个的依次调用就可以了。

 

说明:“面向过程”这个词是在“面向对象”出现之后为与之相对而提出的,它可以看作是“结构化”的别名

 

三、面向对象程序设计

面对日趋复杂的软件系统,结构化程序设计在下面几个方面逐渐暴露出了一些弱点:

 

1、审视问题域的视角。在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,它是人类观察问题和解决问题的主要目标。例如,对于一个学校学生管理系统来说,无论是简单还是复杂,始终是围绕学生和老师这两个客体实施。结构化设计方法所采用的设计思路不是将客体作为一个整体,而是将依附于客体之上的行为抽取出来,以功能为目标来设计构造应用系统。这种做法导致在进行程序设计的时候,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种变换过程,不仅增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路。另外,再仔细思考会发现,在任何一个问题域中,客体是稳定的,而行为是不稳定的。例如,不管是国家图书馆,还是学校图书馆,还是国际图书馆,都会含有图书这个客体,但管理图书的方法可能是截然不同的。结构化设计方法将审视问题的视角定位于不稳定的操作之上,并将描述客体的属性和行为分开,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。面对问题规模的日趋扩大、环境的日趋复杂、需求变化的日趋加快,将利用计算机解决问题的基本方法统一到人类解决问题的习惯方法之上,彻底改变软件设计方法与人类解决问题的常规方式扭曲的现象迫在眉睫,这是提出面向对象的首要原因。

 

2、抽象级别。抽象是人类解决问题的基本法宝。良好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性。抽象主要包括过程抽象和数据抽象。结构化设计方法应用的是过程抽象。所谓过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待。这种抽象级别对于软件系统结构的设计显得有些武断,并且稳定性差,导致很难准确无误地设计出系统的每一个操作环节。一旦某个客体属性的表示方式发生了变化,就有可能牵扯到已有系统的很多部分。而数据抽象是较过程抽象更高级别的抽象方式,将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟。

 

3、封装体。封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。结构化设计方法没有做到客体的整体封装,只是封装了各个功能模块,而每个功能模块可以随意地对没有保护能力客体属性实施操作,并且由于描述属性的数据与行为被分割开来,所以一旦某个客体属性的表达方式发生了变化,就有可能对整个系统产生影响。

 

4、可重用性。可重用性标识着软件产品的可复用能力,是衡量一个软件产品成功与否的重要标志。结构化程序设计方法的基本单位是模块,每个模块只是实现特定功能的过程描述,因此,它的可重用单位只能是模块。但对于当前的软件开发来说,这样的重用力度显得微不足道,而且当参与操作的某些数据类型发生变化时,就不能够再使用那些函数了。因此,渴望更大力度的可重用构件是如今应用领域对

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值