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