今天你Shlemiel了吗 (Shlemiel喷涂算法)

来源:互联网 发布:linux mysql 建表 编辑:程序博客网 时间:2024/04/29 00:52
首先,让我们来看看Shlemiel是什么咚咚。
  是的,Shlemiel不是什么东西,而是一个人物--一则笑话 中的人物:
Shlemiel得到一份当街道油漆匠的工作,工作内容是在马路中间喷涂点画线。第一天,他拿出一罐漆来到他负责的路段,喷涂了300码长的线。“干得不错!”他的老板称赞道,“真是一位麻利的工匠”,然后赏给他一个戈比(一种俄罗斯辅币,译者注)。
第二天,Shlemiel只喷涂了150码。“喏,虽然不如昨天那样好,但你仍然算得上一位麻利的工匠!150码还是值得肯定的一个长度,”老板说完又赏给他一戈比。
接下来的一天,Shlemiel只喷涂了30码长的马路。“才30码!”他的老板吼道。“这太令人难以接受了!第一天你干的工作量是今天的10倍!接下来是怎么回事?”
“我尽力了,”Shlemiel说道。“一天一天下去,我离油漆罐越来越远!”

  看到这里,我们难免会嘲笑Shlemiel的笨拙。
  那么,聪明的你,是否也不时会充当Shlemiel的角色呢?我相信你一定会说:No!--尤其是作为一个聪明的程序员,你怎么可能会写出一个Shlemiel喷涂算法呢?嗯,但愿不会!--只是很多时候只能说事与愿违...
  让我们看看下面一段代码:
void strcat( char* dest, char* src )
{
while (*dest) dest++;
while (*dest++ = *src++);
}
该函数的功能是将一个字符串附加在另一个字符串之后。假设有一串名字要在一个大字符串中串接起来,那就会暴露出来一些问题:
char bigString[1000]; /* 永远也不知道需要分配多大的存储空间... */
bigString[0] = '/0';
strcat(bigString,"John, ");
strcat(bigString,"Paul, ");
strcat(bigString,"George, ");
strcat(bigString,"Joel ");
这能够应付,不是吗?是的。并且,看起来也很漂亮整洁。
函数性能如何?能够运行得尽可能快吗?可扩展性如何?要是有一百万个字符串要追加,这样处理还算得上很好的方式吗?
不,该代码使用的是蹩脚的Shlemiel喷涂算法。


--例子等来自《Joel说软件》
0 0
原创粉丝点击