Maine

纵有疾风起,人生不言弃

类和对象 - 面向过程编程(结构化编程)的不足

结构化编程也称为面向过程的编程,它与面向对象的编程有关。

结构化编程的基本思想是优化自上而下的,即将复杂的大问题分解为许多简单小问题的组合。整个程序分为多个功能模块,不同的人员可以开发不同的模块,只要合作伙伴指定模块之间的通信和协作接口即可。

例如,一个大的在线游戏可以分为动画引擎、地图绘制、人工智能策略、游戏角色管理、用户帐户管理、网络通信协议和许多其他模块。不同的组可以开发不同的模块。每个模块必须提供一个接口(通常是函数和全局变量的集合),以便其他模块可以调用它们提供的函数。

例如,人工智能策略模块可以提供在地图上找到路径的功能。映射模块需要提供查询道路和障碍物、建筑物位置的功能。该功能将由人工智能策略模块中的搜索路径子模块调用。当游戏角色需要向前移动时,它将调用查找人工智能策略模块提供的路径的功能来决定下一步如何行走。

获得计算机行业最高奖项“图灵”奖、 Pascal语言发明者Worth教授有一个着名的公式,即:

数据结构 + 算法 = 程序

这是结构化编程特征的简洁总结。数据结构对应于变量,算法对应于函数,并且算法用于操纵数据结构。

在结构化编程中,算法和数据结构是分开的。没有直观的方法来解释算法运行的数据结构,以及哪些算法在数据结构上运行。当数据结构的设计发生变化时,需要修改分散在整个程序中的所有运行数据结构的算法。

结构化编程也不提供限制可操作的数据结构范围的方法。任何算法都可以操纵任何数据结构。由于错误的写入和关键数据结构的错误操作,这很容易导致程序中的严重问题。坍方。

结构化编程也称为面向过程的编程。该过程使用函数实现。因此,在结构化编程的最终分析中,如何将整个程序划分为函数,哪些函数应该相互调用,以及如何在内部实现每个函数。

此外,结构化编程不可避免地使用一些全局变量来存储数据。例如,在线游戏通常记录当前战场上有多少玩家,地图上每个角色的位置等等。这些全局变量通常由许多函数访问或修改。例如,选择角色前进路径的功能可能需要知道当前地图上的敌人和敌人。

在大型程序的情况下,程序中可能存在数千个函数、,数十万个全局变量,找出函数之间的调用关系以及哪些函数将访问哪些全局变量是非常麻烦的。事情。

结构化程序随着它们变大而难以理解和维护。

在结构化程序中,函数与其操作的数据(全局变量)之间的关系不能清晰直观地表示。随着程序规模的增加,程序变得难以理解。一次很难看出函数之间存在什么样的调用关系。可以为某些数据操作哪些函数,以及哪些数据用于操作某个函数?的。

在这种情况下,当数据项的值不正确时,很难找出导致它的功能,因此程序的错误检查变得困难。

结构化程序不利于修改和扩展(添加新功能)。

结构化编程没有“封装”和“隐藏”的概念。访问变量时可以直接访问它。更改变量的定义时,应找到并修改访问该变量的所有语句。这些陈述可能分散在数百个函数中,这显然非常耗时且费力。

结构化程序不利于代码重用。

编写程序时,通常会发现您需要的函数已经在一个现有程序中具有相同或类似的实现。因此,您自然希望提取源代码的那部分并在新程序中使用它。这称为代码重用。

但是,在结构化编程中,随着程序大小的增加,大量函数、变量之间的关系变得复杂,并且通常很难提取可重用代码。

例如,要重用一个函数,但是此函数会调用新程序未使用的其他一些函数,因此您必须一起提取其他函数。更糟糕的是,您要重用的函数会访问一些全局变量。变量,例如提取不相关的全局变量,或修改重用函数以删除对全局变量的访问。简而言之,结构化程序中各个模块之间的耦合很高,并且存在难以分离的链接。这就像在计算机桌面上使用一个模块,很多设备一团糟。拿笔记本电脑的电源适配器,拿起电源适配器,其电缆拉出很多凌乱的扬声器、耳机、鼠标、外置光驱等等。

简而言之,当结构化程序庞大,难以扩展,难以排除故障且难以重用时,它们将变得难以理解。

随着软件规模的不断扩大,结构化编程变得越来越难以适应软件开发的需求。此时,面向对象的编程方法应运而生。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注