族谱网 头条 人物百科

面条式代码

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:951
转发:0
评论:0
举例以下是一段用BASIC写的程序,是典型面条式代码的例子。程序在屏幕上显示数字1到10及其对应的平方。由于有GOTO指令,此程序需要配合行号才能知道程序的流向,也无法利用缩进(英语:Indent_style)的方式使程序较容易阅读。而且因为跳跃指令的关系,要运行的程序会不可预测的由一个区域跳到另一个区域,不易追踪。现实世界中的面条式代码往往更加复杂,会大幅增加维护的成本。10i=020i=i+130PRINTi;"squared=";i*i40IFi>=10THENGOTO6050GOTO2060PRINT"ProgramCompleted."70END以下则是使用结构化的控制架构后的程序,由于没有GOTO指令,程序已不需要行号,而且可以用缩进的方式,增加程序可读性:PublicSubMain()ForiAsInteger=1To10Console.WriteLine("{0}squar...

举例

以下是一段用BASIC写的程序,是典型面条式代码的例子。程序在屏幕上显示数字1到10及其对应的平方。由于有GOTO指令,此程序需要配合行号才能知道程序的流向,也无法利用缩进(英语:Indent_style)的方式使程序较容易阅读。而且因为跳跃指令的关系,要运行的程序会不可预测的由一个区域跳到另一个区域,不易追踪。现实世界中的面条式代码往往更加复杂,会大幅增加维护的成本。

10i=020i=i+130PRINTi;" squared = ";i*i40IFi>=10THENGOTO6050GOTO2060PRINT"Program Completed."70END

以下则是使用结构化的控制架构后的程序,由于没有GOTO指令,程序已不需要行号,而且可以用缩进的方式,增加程序可读性:

PublicSubMain()ForiAsInteger=1To10Console.WriteLine("{0} squared = {1}",i,i^2)NextConsole.WriteLine("Program Completed.")EndSub

程序中还是有由一个区域跳到一个区域的情形,不过这种跳跃是可预期的,也是标准的作法。使用FOR循环或函数是处理程序流程控制的标准作法。若使用GOTO,也就表示允许程序任意的跳跃。上述示例的代码很短,实际使用的程序其代码更长,若是面条式代码的话会相当难以维护。

汇编语言及脚本语言

当使用各种汇编语言(及其底层的机器码)时,撰写面条式代码会带来更大的危险。其原因是由于这些低级语言很少有可以对应FOR循环或WHILE循环的机能。许多脚本语言也有类似的情形,例如DOS的批处理文件或是OpenVMS上的DCL。

若将结构化程序设计中的作法移植到汇编语言的程序,会对可靠性及可维护性有显著的改善。例如限制GOTO的使用,只用GOTO来产生类似结构化程序设计中流程控制的效果、另外许多汇编语言都有提供函数调用的机制,可以有类似程序化程序设计(Procedural programming)的效果。汇编语言一般都会有宏,而且支持参数传递,以避免全域变量的使用,也可避免远隔作用(action at a distance)的反面设计模式。

使用高级语言撰写的程序可以利用一些标准流程控制的作法(如以上第2例的for loop),不过当汇编为汇编语言或机器码时,由于最后仍利用GOTO或IF之类的指令表示高级语言的标准流程控制,看起来会像是面条式代码。因为汇编器会忠实的将程序的结构转换为汇编语言,因此不会遇到其他结构性较弱的语言所遇到,程序流程难以辨识的问题。不过,若是程序作了过多的最优化,可能在缩小程序大小的同时,也影响其程序的结构,若配合source-level debugger使用,有时会因些造成一些困扰。

馄饨式代码

馄饨式代码(Ravioli code)是指程序中是由许多小的、松散连接的部分所构成。馄饨式代码可以和面条式代码作比较,后者用面条来代表程序的结构,而前者用馄饨(Ravioli)来代表程序中的对象。这种代码虽然满足了低耦合性的要求,但是过度的分离与封装导致过多的调用,使得调用堆栈容易变得臃肿,而且也增加了阅读代码的难度。

参见

结构化程序设计:程序中不使用goto,只使用像loop, for及其他的流程控制指令。

国际C语言混乱代码大赛:一个设法写出让人难以理解C语言代码的比赛。

参考文献

本条目部分或全部内容出自以GFDL授权发布的《自由在线电脑词典》(FOLDOC)。


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 伪代码
参见流程图
· 源代码
作用源代码主要功用有如下2种作用:生成目标代码,即计算机可以识别的代码。对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员,都忽视软件说明的编写;因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。需要指出的是,对于编译语言来说,例如C/C++/Java,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。但是目前有许多流行的脚本语言,例如Perl/Python都不需要重新编译,修改完代码可以直接执行看到修改的结果。代码组合源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分...
· 代码重构
重构代码图一图二在软件工程学里,重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码,有时非正式地称为“清理干净”。在极限编程或其他敏捷方法学中,重构常常是软件开发循环的一部分:开发者轮流增加新的测试和功能,并重构代码来增进内部的清晰性和一致性。自动化的单元测试保证了重构不至于让代码停止工作。重构既不修正错误,又不增加新的功能性。反而它是用于提高代码的可读性或者改变代码内部结构与设计,并且移除死代码,使其在将来更容易被维护。重构代码可以是结构层面抑或是语意层面,不同的重构手段施行时,可能是结构的调整或是语意的转换,但前提是不影响代码在转换前后的行为。特别是,在现有的程序的结构下,给一个程序增加一个新的行为可能会非常困难,因此开发人员可能先重构这部分代码,使加入新的行为变得容易。一个重构的小范例是修改一个变量的名称使其具有更明确的含义,例如从单个字母的“i”重构为“interestR...
· 代码混淆
白盒密码白盒密码(White-boxcryptography)是指够抵抗白盒攻击的密码算法,以及对应实现。常见的实现方式是借助高强度的代码及算法混淆。
· 目标代码
目标文件格式目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世,人们定义了例如COFF和ELF这些格式,并在不同的系统上使用它们。通常,链接器的输入和输出使用相同的文件格式,库文件和可执行文件格式也是一样使用相同的格式。设计或选择一种目标文件格式是计算系统整体设计的关键部分。它影响着链接器的性能并因此影响着程序员在开发时的总耗时;如果格式是用于可执行文件,那么格式的设计还会影响程序的开始运行花费的时间,以及影响到系统对用户请求的反应速度。大部分目标文件格式以区块的方式来组织,每一区块中都装载着同种数据。在虚拟内存系统需要这些块的时候,它可以通过将这些块分页后调入,无需进一步地处理就可使用。最简单的目标文件格式是DOS的COM文件格式(OBJ文...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信