layout: post author: zoomq title: D码点评:7 如何写出无法维护的代码 description: ~ 麻辣评点,善意满盈 categories: gDgcoDe tags: gdg D码点评 dd wechat coding


据说在每一个高校里,都有一个扫地的老太太. 很偶然地,当她经过一个博士生身边,扫一眼厚厚的论文集,会低声提醒对方说:小心,第134条文献引用错误.

993869_513707.jpg(JPEG 图像,320x420 像素)

How to develop unmaintainable software

今天再次有人发现国外的吐槽: Typical Programmer - How to develop unmaintainable software

其实很久以前,天顶星人就已经发现并总结了很多领域技巧!

比如: 2011年6月3日 陈皓

酷壳里有很多我觉得很不错的文章,但是访问量最大的却是那篇<<6个变态的Hello World>>,和它能在本站右边栏"全站热门"中出现的还有"如何加密源代码",以及编程真难啊等这样的文章. 可见本站的读者们的偏好,我也相信你们都是"身怀绝技"的程序员. 所以,今天给大家推荐这篇文章,相信一定能触动大家的兴奋点.

这篇文章的原文在这里(http://mindprod.com/jgloss/unmain.html),我看完后我想说--

我把文章节选了一些,也并没有完全翻译,简译一下,也加入了一些自己的调侃. 对于有下面这些编程习惯的朋友,请大家对号入座. 另外,维护程序的朋友们,你们死定了!!

woodpeckerIf builders built buildings 
the way programmers write programs, 
then the first woodpecker 
that came along would destroy civilization. 
(如果建筑师盖房子就像程序员写程序一样,
    那么,第一只到来的啄木鸟就能毁掉我们的文明)

woodpecker.png(PNG 图像,64x64 像素) ~ Gerald Weinberg (born: 1933-10-27 age: 77) Weinberg's Second Law

程序命名

伪装欺诈

把注释和代码交织在一起.

for(j=0; j<array_len; j+ =8)
{
    total += array[j+0 ];
    total += array[j+1 ];
    total += array[j+2 ]; /* Main body of
    total += array[j+3]; * loop is unrolled
    total += array[j+4]; * for greater speed.
    total += array[j+5]; */
    total += array[j+6 ];
    total += array[j+7 ];
}

隐藏宏定义

如:#define a=b a=0-b ,当人们看到 a=b 时,谁也想不到那是一个宏.

换行

如下所示,下面的示例使用搜索xy_z变得困难.

#define local_var xy\
_z // local_var OK

代码和显示不一致

比如,你的界面显示叫postal code,但是代码里确叫 zipcode.

隐藏全局变量

把使用全局变量以函数参数的方式传递给函数,这样可以让人觉得那个变量不是全局变量.

使用同意词

如:

#define xxx global_var // in file std.h&nbsp;
#define xy_z xxx // in file ..\other\substd.h&nbsp;
#define local_var xy_z // in file ..\codestd\inst.h

使用相似的变量名

如:单词相似,swimmer 和 swimner,

字母相似:ilI1| 或 oO08. parselnt 和 parseInt, D0Calc 和 DOCalc.

还有这一组:xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z.

重载函数

使用相同的函数名,但是其功能和具体实现完全没有关系.

操作符重载

重载操作符可以让你的代码变得诡异,感谢CCTV,感谢C++. 这个东西是可以把混乱代码提高到一种艺术的形式. 比如:重载一个类的 ! 操作符,但实际功能并不是取反,让其返回一个整数. 于是,如果你使用 ! ! 操作符,那么,有意思的事就发生了-- 先是调用类的重载 ! 操作符,然后把其返回的整数给 ! 成了 布尔变量,如果是 !!! 呢?呵呵.

重新#define

看过本站那些混乱代码的文章,你都会知道宏定义和预编译对于写出不可读的代码的重大意义. 不过,一个具有想像力的东西是--在头文件中使用预编译来查看这个头文件被include了几次,而被include不同的次数时,其中的函数定义完全不一样.

#ifndef DONE
#ifdef TWICE
// put stuff here to declare 3rd time around
void g(char* str);
#define DONE
#else // TWICE
#ifdef ONCE
// put stuff here to declare 2nd time around<
void g(void* str);
#define TWICE
#else // ONCE
// put stuff here to declare 1st time around
void g(std::string str);
#define ONCE
#endif // ONCE
#endif // TWICE
#endif // DONE

文档和注释

程序设计

混乱你的代码

测试

其它

太TMD强大了

这个文档 中还有很多很多,实在是太TMD强大了,大家自己去看看吧. 有精力有能力的朋友不妨把其翻译成中文.

总之,我们的口号是--

Write Everywhere, Read Nowhere

(全文完)

是也乎

幸福的家庭各有各的幸福,不幸福的家庭是类似的 ...

嗯嗯嗯,这话,在电算界就应该反过来了,,,

所以,与日俱进的代码中的恶趣味, 有人形容为 "坏味道" 甚至于总结出了一大本书:

重构 (豆瓣)

但是,相比无意的写出 "坏味道" 的代码,着意的发明 unmaintainable 的技巧来, 就 So Naive 了,,,

所以,这种技巧我们也是要进行认真研究的,以便一眼识别,就地...

当期活动: PyCon2013CHina 珠海场

请及时举报你身边的 华蠎行者! 举报热线: zoomquiet+pycon (AT) gmail.com



以上...


码不停提马上无虫 ;-)

|_|0|_|
|_|_|0|
|0|0|0|

加入 珠海GDG

  1. 注册 G+
  2. 关注 GDG Zhuhai
  3. 成为 GDG Zhuha开发者

通过 珠海GDG 可以:

    第一时间获知谷歌最新的技术,
    可以学到如何去谷歌平台上赚钱的思路和方法,
    可以认识很多有可能将来一起走上自己创业道路的人,
    可以学会把你的创新带向国际市场,
    参加那里的活动有经常和国际上的开发者们进行交流的机会...

PS:

若无意外,题图都是从原文提取或是通过 Google 图片搜索出来的, 版权属左, 不负责任 ;-)

PPS:

珠海GDG wechat/Blog 都是欢迎投稿的,只要追认内容吻合以下条件:

0. 有趣 ~ 至少是自个儿有兴趣的领域吧...
1. 有料 ~ 至少有点儿原创的东西吧..
2. 有种 ~ 至少不能是成功学吧!

有好物的,及时向大妈们吼: [email protected]

微信栏目

当前应该是:

    G术图书 (gb:推荐好书,书无中外)
    D码点评 (dd:麻辣评点,善意满盈)
    G说公论 (gt:时评杂文,新旧不拘)
    珠的自白(dm:大妈自述,每周一篇)
    海选文章(hd:得要相信,大妈法眼)

总之! 珠海的组委大妈们,决定开始坚持发文,方方面面细细同大家分享/交流

总之! 请大家告诉大家, 珠海生活中的技术社区 已经认真回归 微信,都来订阅吧!

订阅方法

GDG珠海 社区资源:


Author: Zoom.Quiet /mail / gittip / github