
结构化程序设计也称为面向过程的程序设计面向过程的程序设计,相对于面向对象的程序设计.
结构化编程的基本思想是自上而下,逐步完善,即将复杂的大问题逐层分解为许多简单的小问题的组合. 整个程序分为多个功能模块. 只要协作者指定模块之间的通信和协作接口,就可以由不同的人员开发不同的模块.
例如,大型游戏可以分为许多模块,例如引擎,映射,人工智能策略,游戏角色管理,用户帐户管理,网络通信协议等. 不同的小组可以开发不同的模块,每个模块必须提供一个接口(通常是函数和全局变量的集合),以便其他模块可以调用它们提供的函数.
例如,人工智能策略模块可以提供在地图上找到路径的功能. 测绘模块需要提供查询道路,障碍物和建筑物位置的功能. 该功能称为模块调用,当游戏角色需要前进时,将调用人工智能策略模块提供的寻找路径的功能,决定下一步的行走方式.

Voss教授是图灵奖的获得者,该奖是计算机行业的最高奖项,也是Pascal语言的发明者,它具有一个著名的公式,即:
数据结构+算法=程序
这很好地总结了结构化编程的特征. 数据结构对应于变量,算法对应于函数. 算法用于处理数据结构.
在结构化编程中,算法和数据结构是分开的. 没有直观的方法来解释算法可操作哪些数据结构以及哪些算法可操作数据结构. 当数据结构的设计发生变化时,对散布在整个程序中的数据结构进行操作的所有算法都需要进行修改.

结构化编程也不提供限制可操作数据结构范围的方法. 任何算法都可以对任何数据结构进行操作,这很容易由于写入错误和关键数据结构的错误操作而导致算法出现. 严重的问题甚至崩溃.
结构化编程也称为面向过程的编程. 该过程通过功能实现. 因此,结构化编程的最终考虑因素是如何将整个程序划分为多个函数,哪些函数应该相互调用,以及每个函数如何在内部实现.
此外,结构化编程不可避免地使用一些全局变量来存储数据. 例如,游戏通常使用一些全局变量来记录当前战场上有多少玩家,以及每个角色在地图上的位置. 这些全局变量通常由许访问或修改. 例如,选择角色路径的功能可能需要知道当前地图上的哪些敌人及其位置.
对于大型程序,程序中可能有数千个函数和数百个全局变量. 要了解函数之间的调用关系以及哪些函数将访问哪些全局变量,是一件很麻烦的事情.

下图显示了结构化程序模式. Sub代表每个功能,箭头代表“访问”或“呼叫”.

图: 结构化程序的模式
当规模变大时,结构化程序将难以理解和维护. 在结构化程序中,无法清楚直观地反映函数与函数所操作的数据(全局变量)之间的关系. 随着程序大小的增加,程序逐渐变得难以理解,一眼就很难看出函数之间存在哪些调用关系,某些数据的函数可以在其上运行,以及哪些数据是所使用的函数. 操纵.

在这种情况下,当某一数据项的值不正确时,很难找出是由哪个函数引起的,因此很难检查程序. 结构化的程序不利于修改和扩展(添加新功能). 结构化编程不具有“封装”和“隐藏”的概念. 访问变量时可以直接访问它. 更改变量的定义后,必须找到并修改所有访问该变量的语句. 这些语句可能分散在数百个函数中,这显然非常耗时且费力. 结构化程序不利于代码重用. 在编写程序时,通常会发现它所需的某个功能在现有程序中具有相同或相似的实现,因此自然希望可以将部分源代码提取并用于新程序中. 称为代码重用.
但是,在结构化编程中,随着程序大小的增加,大量函数和变量之间的关系变得复杂,并且通常很难提取可重用的代码.
例如,您想重用一个函数,但是此函数调用一些新程序未使用的其他函数,因此您必须将其他函数一起提取;更糟糕的是,也许要访问要重用的函数对于某些全局变量,还必须提取不相关的全局变量,或者修改重用的函数以删除对全局变量的访问.
简而言之,结构化程序中各个模块之间存在高度的耦合,并且存在着千丝万缕的联系. 想要重复使用某个模块,就像一台电脑,里面有很多设备. 把笔记本电脑的电源适配器放在桌上,拿起电源适配器,但其连接电缆却拔出了许多凌乱的扬声器,耳机,鼠标面向过程的程序设计,外部设备光盘驱动器等.
简而言之,当规模很大时,结构化程序变得难以理解,难以扩展,难以调试和难以重用.
随着软件规模的不断扩大,结构化编程变得越来越难以满足软件开发的需求. 这时,面向对象的编程方法应运而生.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-181700-1.html
空间让我们的心拉距
哪里可以看到
中国就打他右边脸