| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4896 人关注过本帖
标题:【转载】面条式代码
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:15 
【转载】面条式代码
面条式代码

汇 编语言的一个主要问题是需要好几条汇编语句才能实现一条高级语言的语句。很多时候,汇编语言程序员发现通过将程序跳转到一些程序结构的中间,可以节约几个 字节或几个周期。在确定这点(并对代码作了相应的修改)后,代码最后会包含一串跳转指令。如果在每条跳转指令和相应的目标地址间连上一条线,最后代码看上 去会像一碗堆起的意大利面条,通常称这样的代码为“面条式(Spaghetti)”代码。

“面条式”代码存在一个主要缺点:可读性差,很难确定它到底完成什么工作。许多程序开始还是结构化的,但性能优化后都变成了“面条式”代 码;但是,实际上“面条式”代码很少是高效的,因为太难确定它到底完成什么功能,从而也很难使用更好的算法来改进。因此,最后导致“面条式”代码比结构化 代码的效率更低。

“面条式”代码的确可能会提高程序的性能,但这只是在对程序做完所有其他可能的改进还不能达到要求时,不得已而采取的办法。开始编写程序 时,要尽量在程序中使用直接的if和switch语句,当程序正常工作并易于理解后,才开始合并代码段(使用jmp指令)。当然,除非真的值得,否则不要 消除程序的结构。

在结构化编程界有一条著名的谚语:“除了GOTO语句,指针是编程语言中最危险的元素”。类似的有:“指针损害数据结构,GOTO损害控制 结构”。换句话说,要避免过量使用指针。如果指针和GOTO语句的结构性较差,那么间接跳转就是最差的一种结构,因为它同时包含了指针和GOTO。因此不 要随意使用间接跳转指令。这会使程序变得难以阅读。毕竟,(理论上)间接跳转指令可以将控制转移到程序中的任何标号处;可以想象,如果不知道指针包含的内 容,又遇到使用该指针的间接跳转指令,要理清程序流程是多么困难的一件事。因此,在使用间接跳转指令时要格外谨慎。

原帖链接:http://codex.
搜索更多相关主题的帖子: 意大利 程序员 面条 
2014-09-05 10:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
相关阅读:
1.http://zh.
2.http://blog.


授人以渔,不授人以鱼。
2014-09-05 11:00
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
一开始用goto语句的时候,感觉还挺不错的,能随意跳转。
但当我在写一个程序,其中用上了好几条goto语句,最后把我自己都给弄糊涂了,就再也不敢滥用了,尤其是之后看了别人写的代码用几个for、if嵌套就解决了那个问题。

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-05 12:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
“避免过早优化”,本来就排在编程规范中戒条的前列,但偏偏本坛很多人,刚开始学,自称新手,就总对优化倍感兴趣,以写乱码为荣、为能,入了魔道而不知。不过,这可说是历史悠久的意识形态分歧了,的确是有不少人好那道的,我不在那道,所以一向不参与那些问题。

授人以渔,不授人以鱼。
2014-09-05 12:47
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
有“过早优化”的嫌疑??

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-05 14:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wssy213在2014-9-5 14:14:43的发言:

有“过早优化”的嫌疑??

是的。在程序还没有投入实际运行的时候,就去探讨如何加速、如何节省空间,即是过早优化。优化应该是拖到最后的,而且是在实际运行过程中证明已经严重影响效率的情况,才进行优化活动。通常有效的优化是改变算法和数据结构,而不是用诸如指针代替数组、用位域代替整数标志这类小技巧,偏偏很多人热衷于这类伪优化。在变动算法和数据结构这种层面上说,语言的区别不大,那种啥啥语言效率高的说法,非常无聊,事实上对一个实际应用的程序来说,用什么语言编写的差别并不大,那是程序员能否掌控相应语言的问题,不是语言的问题(只会C版本的算法和数据结构用法,就是典型的没学透表现)。

授人以渔,不授人以鱼。
2014-09-06 10:21
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
您的意思是:这种"面条式"代码可以是你的初始结果,但不应该是让自己感到满意的结果??

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-07 12:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
架构和组织比局部优化有效得多,不要把心思花在局部优化上,后者属于小技巧。在学编程的时候,一开始就养成局部优化的思维,必然缺少大局观,倾向于这里减少几个时钟周期、那里节约几个字节空间之类的细微动作,比如用宏来减免函数调用开销这类邪路,就是这样来的,而且为了尽量缩减函数开销,他们很少拆分函数,形成大杂烩,从而构成面条式代码,看看多少人自以为学会C即可自然精通C++就知道了。正因为价值观不同(他们认为这样做提高效率比其他指标重要得多),所以属于意识形态问题,就如无神论者和有神论者无法说服对方一样。

[ 本帖最后由 TonyDeng 于 2014-9-7 13:31 编辑 ]

授人以渔,不授人以鱼。
2014-09-07 13:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看看下面的面条式代码:

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

char str[] = "****dfs*hu*j";

int main(void)
{
    size_t length = strlen(str);
    size_t index, pos;
    bool found = false;

    puts(str);

    for (index = 0, pos = 0; (index < length) || (pos < length); ++index)
    {
        if (str[index] != '*')
        {
            found = true;
        }
        if (found)
        {
            str[pos] = str[index];
            if (index >= length)
            {
                str[pos] = '*';
            }
            ++pos;
        }
    }

    puts(str);

    _getch();
    return EXIT_SUCCESS;
}

问题源自:https://bbs.bccn.net/thread-435700-1-1.html

这个代码逻辑尚算清晰,但确实是面条式代码,当问题要求增加一点复杂性时,就不好玩儿了。最主要的问题,是它的各种效用是纠缠在一起的,很难分解,那么简单的一点需求,就有这种复杂度,如果不是(按功能算)整段代码行数少,这种代码是不好阅读理解的。这是强硬合成一个循环造成的,如果把各种具体的功能分开循环,表达起来就清晰一点,理解和修改都相对容易,但仍然不及把每一小段功能循环封装到函数中命名来得好。

其实,这个题目用标准库提供现成的函数就可以了:找到非*开头的第一个位置,用memmove()挪动数据,然后把后面空出来的全填*号,这里的代码,实际上是写了一个memmove()函数。这就是标准库千锤百炼收集这么一套函数库的用处,它们足以应付绝大多数需求,你越使用,越发现能用上它们的场合非常广泛,一般来说不需要自己另写功能类似的函数。


[ 本帖最后由 TonyDeng 于 2014-9-7 17:11 编辑 ]

授人以渔,不授人以鱼。
2014-09-07 17:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wssy213在2014-9-5 14:14:43的发言:

有“过早优化”的嫌疑??


我回你的第一个主题帖,就提到这个问题。

授人以渔,不授人以鱼。
2014-09-07 22:30
快速回复:【转载】面条式代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031016 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved