本文如何编写不可维护的代码涵盖了人类已知的一些最出色的技术。我最喜欢的一些是:
婴儿名字的新用途
买一本婴儿命名书的副本,您将永远不会为变量名所迷。弗雷德(Fred)是一个很棒的名字,而且易于输入。如果您要查找易于输入的变量名,请使用DSK键盘输入adsf或aoeu。
创意拼写错误
如果必须使用描述性变量和函数名称,请拼写错误。通过在某些函数和变量名中拼写错误,并在其他函数和变量名中拼写正确(例如SetPintleOpening SetPintalClosing),我们可以有效地拒绝使用grep或IDE搜索技术。它的效果非常好。通过在不同的剧院/剧院拼写托利或花托来增加国际风味。
是抽象的
在命名函数和变量时,请大量使用抽象词,如它,所有内容,数据,句柄,内容,操作,例程,执行和数字,例如:例程X48,PerformDataFunction,DoIt,HandleStuff和do_args_method。
大写
在单词中间随机将一个音节的第一个字母大写。例如ComputeRasterHistoGram()。
小写l看起来很像数字1
使用小写字母l表示长常量。例如10l更可能被误认为10L是101。禁止所有明显使uvw ww gq9 2z 5s il17 |!j oO08`'; ;;。m nn rn {[()]}歧义的字体。
回收变量
只要范围规则允许,请重用现有的不相关变量名。同样,将相同的临时变量用于两个不相关的目的(目的是节省堆栈插槽)。对于恶魔般的变体,例如,将变量变形,例如,在很长的方法的顶部为变量赋值,然后在中间的某个位置,以细微的方式更改变量的含义,例如将其转换为从0开始的坐标到从1开始的坐标。确定不要记录此含义的变化。
cd wrttn wtht vwls s mch trsr
在变量名或方法名中使用缩写时,请为同一个单词使用多个变体来消除无聊的烦恼,甚至偶尔将其拼写出来。这有助于打败那些使用文本搜索仅了解程序某些方面的懒汉。可以考虑将变体拼写作为策略的变体,例如,将国际颜色与美国颜色和花花公子的库勒兹混合在一起。如果完整拼写姓名,则只有一种可能的方式可以拼写每个姓名。这些对于维护程序员来说太容易记住了。因为缩写词有很多不同的方法,所以您可以使用几个具有相同外观目的的不同变量。另外,维护程序员甚至可能不会注意到它们是单独的变量。
模糊的影片参考
使用常量名称(例如LancelotsFavouriteColour)代替蓝色,并为其分配十六进制值$ 0204FB。该颜色看起来与屏幕上的纯蓝色相同,因此维护程序员必须计算出0204FB(或使用某些图形工具)才能知道其外观。只有熟悉Monty Python和The Holy Grail的人才会知道Lancelot最喜欢的颜色是蓝色。如果维护程序员无法从内存中引用整个Monty Python电影,那么他或她就不会成为程序员。
记录明显
在代码中加上/ *这样的注释,然后在i * /上加1;但是,切勿像包装或方法的总体用途那样记录毛茸茸的东西。
记录为什么不为什么
仅记录程序的详细信息,而不记录程序要完成的操作。这样,如果存在错误,修复程序将不知道代码应该做什么。
副作用
在C语言中,功能应该是幂等的(没有副作用)。我希望该提示足够。
使用八进制
将八进制文字走私到十进制数字列表中,如下所示:
array = new int []
{
111,
120,
013,
121,
};
扩展ASCII
扩展的ASCII字符作为变量名非常有效,包括ß,Ð和ñ字符。如果不使用简单的文本编辑器进行复制/粘贴,则几乎无法键入它们。
其他语言的名字
使用外语词典作为变量名的来源。例如,使用德语punkt作为点。如果您不懂德语,那么维护编码人员将享受解密其含义的多元文化经验。
数学名称
选择伪装成数学运算符的变量名称,例如:
openParen = (slash + asterix) / equals;
伪装成注释和副词Versa的代码
包括已注释掉但乍一看似乎没有的代码部分。
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 ];
}
如果没有颜色编码,您会注意到三行代码被注释掉了吗?
伪装成关键字的任意名称
在记录文档时,您需要一个任意名称来表示文件名,请使用“ file”。切勿使用明显任意的名称,例如“ Charlie.dat”或“ Frodo.txt”。通常,在您的示例中,请使用听起来像保留关键字的任意名称。例如,参数或变量的好名字将是“ bank”,“ blank”,“ class”,“ const”,“ constant”,“ input”,“ key”,“ keyword”,“ kind”,“ output” ,“参数”,“参数”,“系统”,“类型”,“值”,“ var”和“变量”。如果将实际的保留字用作任意名称,那么命令处理器或编译器会拒绝这些保留字,那就更好了。如果做得好
代码名称不得与屏幕名称匹配
选择您的变量名称,使其与在屏幕上显示此类变量时所使用的标签完全无关。例如,在屏幕上标记字段“邮政编码”,但在代码中调用关联的变量“ zip”。
选择最佳的过载运营商
在C ++中,重载+,-,*,/做与加,减等完全无关的事情。毕竟,如果Stroustroup可以使用shift运算符执行I / O,那么为什么不应该同样有创意?如果您超载+,请确保以i = i + 5的方式执行;与i + = 5完全不同;这是将重载操作员的混淆度提高到较高水平的示例。重载“!” 一个类的运算符,但具有重载与求反或求反无关。使它返回一个整数。然后,为了获得逻辑值,必须使用'!!!”。但是,这会颠倒逻辑,因此[Drum roll]必须使用'!!!!”。不要混淆了!运算符,使用〜按位逻辑否定运算符返回布尔值0或1。
例外情况
我将让您了解一个鲜为人知的编码秘密。例外是背后的痛苦。正确编写的代码永远不会失败,因此实际上不需要异常。不要浪费时间在他们身上。子类化异常适用于那些知道其代码将失败的不称职的人。通过在整个调用System.exit()的应用程序中(在主程序中)仅进行一次try / catch,可以大大简化程序。只需在每个方法标头上贴上一组完全标准的抛出即可,无论它们实际上是否可以抛出任何异常。
魔术矩阵位置
在某些矩阵位置使用特殊值作为标志。一个好的选择是与均质坐标系一起使用的转换矩阵中的[3] [0]元素。
重新介绍了魔术阵列插槽
如果需要给定类型的多个变量,只需定义它们的数组,然后按数字访问即可。选择只有您知道并且不记录它的编号约定。并且不要为索引定义#define常量。每个人都应该知道全局变量widget [15]是取消按钮。这只是在汇编代码中使用绝对数字地址的最新变体。
永不美化
切勿使用自动源代码整理器(美化器)来使代码保持一致。游说他们禁止他们进入您的公司,理由是它们在PVCS / CVS(版本控制跟踪)中创建了虚假的增量,或者每个程序员都应该永久保留自己的缩进样式,这对于他编写的任何模块都是神圣不可侵犯的。坚持让其他程序员在“他的”模块中遵守那些特殊的约定。禁止美化器非常容易,即使它们节省了数百万次手动对齐的击键操作,又浪费了很多时间来误解未对齐的代码。只需坚持每个人都使用相同的整理格式,不仅用于存储在公共存储库中,还可以在编辑时使用。这开始了RWAR,而老板为了保持和平,将禁止自动整理。没有自动整理 现在,您可以随意将代码错位以使人产生错觉,即循环和if的主体比实际长或短,或者else子句与实际匹配的不相同。例如
if(a)
if(b) x=y;
else x=z;
测试是为了co夫
勇敢的编码器将绕过该步骤。太多的程序员害怕他们的老板,害怕丢掉他们的工作,害怕顾客讨厌的邮件,以及害怕被起诉。这种恐惧使行动瘫痪,并降低了生产率。研究表明,取消测试阶段意味着管理人员可以提前设定发货日期,这显然有助于计划过程。有了恐惧,创新和实验就可以开花。程序员的职责是产生代码,并且可以通过服务台和旧版维护小组的共同努力来完成调试。
如果我们对自己的编码能力充满信心,那么就不需要进行测试了。如果我们从逻辑上看待这个问题,那么任何傻瓜都可以认识到测试甚至都没有试图解决技术问题,而是情感上的信心问题。对于这种缺乏信心的问题,一种更有效的解决方案是完全消除测试,并让我们的程序员参加自尊课程。毕竟,如果我们选择进行测试,那么我们就必须测试每个程序的更改,但是我们只需要让程序员参加建立自尊心的一门课程即可。成本收益是显而易见的。
颠倒通常的真假惯例
颠倒通常对是非的定义。听起来很明显,但是效果很好。您可以隐藏:
#define TRUE 0
#define FALSE 1
在代码深处的某个地方,以便从程序的内容中删除任何人都看不到的文件。然后强制程序进行如下比较:
if ( var == TRUE )
if ( var != FALSE )
有人必须“纠正”表面上的冗余,并以通常的方式在其他地方使用var:
if ( var )
另一种技术是使TRUE和FALSE具有相同的值,尽管大多数人都会考虑这种欺骗。使用值1和2或-1和0是使人绊倒并看起来仍然受人尊敬的更巧妙的方法。您可以在Java中使用相同的技术,方法是定义一个称为TRUE的静态常量。程序员可能会更怀疑,因为您在Java中有一个内置的文字,因此您一无所获。
利用精神分裂症
Java对数组声明有精神分裂症。您可以使用旧的C方法String x [](使用混合的后缀表示法)或新的方法String [] x(使用纯前缀表示法)来实现。如果您想让人们真正困惑,请混合使用符号。g。
byte[ ] rowvector, colvector , matrix[ ];
等效于:
byte[ ] rowvector;
byte[ ] colvector;
byte[ ][] matrix;