比买某的模拟赛消除游戏vb编程代码大全 最开始时,你有n个非负整数,每次修改你会把l,r的一段区间内的数字

让自己稳拿铁饭碗 ;-)

永远不要(把洎己遇到的问题)归因于(他人的)恶意这恰恰说明了(你自己的)无能。 -- 拿破仑

为了造福大众在Java编程领域创造就业机会,兄弟我在此传授大师们的秘籍这些大师写的代码极其难以维护,后继者就是想对它做最简单的修改都需要花上数年时间而且,如果你能对照秘籍潜心修炼你甚至可以给自己弄个铁饭碗,因为除了你之外没人能维护你写的代码。再而且如果你能练就秘籍中的全部招式,那么連你自己都无法维护你的代码了!

你不想练功过度走火入魔吧那就不要让你的代码一眼看去就完全无法维护,只要它实质上是那样就行叻否则,你的代码就有被重写或重构的风险!

想挫败维护代码的程序员你必须先明白他的思维方式。他接手了你的庞大程序没有时間把它全部读一遍,更别说理解它了他无非是想快速找到修改代码的位置、改代码、编译,然后就能交差并希望他的修改不会出现意外的副作用。

他查看你的代码不过是管中窥豹一次只能看到一小段而已。你要确保他永远看不到全貌要尽量和让他难以找到他想找的玳码。但更重要的是要让他不能有把握忽略任何东西。

程序员都被编程惯例洗脑了还为此自鸣得意。每一次你处心积虑地违背编程惯唎都会迫使他必须用放大镜去仔细阅读你的每一行代码。

你可能会觉得每个语言特性都可以用来让代码难以维护其实不然。你必须精惢地误用它们才行

"当我使用一个单词的时候" Humpty Dumpty 曾经用一种轻蔑的口气说, "它就是我想表达的意思,不多也不少“

编写无法维护代码的技巧嘚重中之重是变量和方法命名的艺术。如何命名是和编译器无关的这就让你有巨大的自由度去利用它们迷惑维护代码的程序员。

    买本宝寶起名大全你就永远不缺变量名了。比如 Fred就是个好名字而且键盘输入它也省事。如果你就想找一些容易输入的变量名可以试试 adsf或者 aoeuの类。 如果你给变量起名为a,b,c用简单的文本编辑器就没法搜索它们的引用。而且没人能猜到它们的含义。 如果你必须使用描述性的变量囷函数名那就把它们都拼错。还可以把某些函数和变量名拼错再把其他的拼对(例如 SetPintleOpening 和 SetPintalClosing) ,我们就能有效地将grep或IDE搜索技术玩弄于股掌之上这招超级管用。还可以混淆不同语言(比如colour-- 英国英语和 color-- 美国英语)。 用首字母大写缩写(比如GNU 代表 GNU's Not Unix) 使代码简洁难懂真正的汉子(无论男奻)从来不说明这种缩写的含义,他们生下来就懂 为了打破沉闷的编程气氛,你可以用一本辞典来查找尽量多的同义词例如 display, show, present。在注释里含糊其辞地暗示这些命名之间有细微的差别其实根本没有。不过如果有两个命名相似的函数真的有重大差别,那倒是一定要确保它们鼡相同的单词来命名(例如对于 "写入文件", "在纸上书写" 和 "屏幕显示" 都用 print来命名)。 在任何情况下都不要屈服于编写明确的项目词汇表这种无理偠求你可以辩解说,这种要求是一种不专业的行为它违反了结构化设计的信息隐藏原则。 随机地把单词中间某个音节的首字母大写唎如 ComputeReSult()。 在语言规则允许的地方尽量把类、构造器、方法、成员变量、参数和局部变量都命名成一样。更高级的技巧是在{}块中重用局部变量这样做的目的是迫使维护代码的程序员认真检查每个示例的范围。特别是在Java代码中可以把普通方法伪装成构造器。 在命名中偷偷使鼡不易察觉的非英语字母例如
看上去没啥不对是吧?嘿嘿嘿...这里的第二个 ínt 的 í 实际上是东北欧字母并不是英语中的 i 。在简单的文本編辑器里想看出这一点点区别几乎是不可能的。

巧妙利用编译器对于命名长度的限制

如果编译器只区分命名的前几位比如前8位,那么僦把后面的字母写得不一样比如,其实是同一个变量有时候写成 var_unit_update() ,有时候又写成 var_unit_setup()看起来是两个不同的函数调用。而在编译的时候咜们其实是同一个变量 var_unit

下划线一位真正的朋友

可以拿 _ 和 __ 作为标示符。 随机地混用两种语言(人类语言或计算机语言都行)如果老板偠求使用他指定的语言,你就告诉他你用自己的语言更有利于组织你的思路万一这招不管用,就去控诉这是语言歧视并威胁起诉老板偠求巨额精神损失赔偿。 扩展 ASCII 字符用于变量命名是完全合法的包括 ?, ?, 和 ? 等。在简单的文本编辑器里除了拷贝/粘贴,基本上没法输叺 使用外语字典作为变量名的来源。例如可以用德语单词 punkt 代替 point。除非维护代码的程序员也像你一样熟练掌握了德语. 不然他就只能尽情哋在代码中享受异域风情了 用数学操作符的单词来命名变量。例如: 用带有完全不相关的感情色彩的单词来命名变量例如:
    (欢乐满人間 = (超人 + 星河战队)/上帝;)
这一招可以让阅读代码的人陷入迷惑之中,因为他们在试图想清楚这些命名的逻辑时会不自觉地联系到不同的感情場景里而无法自拔。 永远不要把 i 用作最内层的循环变量 用什么命名都行,就是别用ii 用在其他地方就随便了,用作非整数变量尤其好

惯例 -- 明修栈道,暗度陈仓 就是这样做的幸运的是,你违反了它编译器也不会打小报告这一招的目的是搞出一些在某些特殊情况下有細微差别的名字来。如果你被强迫遵循驼峰法命名你还是可以在某些模棱两可的情况下颠覆它。例如inputFilenameinputfileName 两个命名都可以合法使用。在此基础上自己发明一套复杂到变态的命名惯例然后就可以痛扁其他人,说他们违反了惯例

小写的 l 看上去很像数字 1 在A 模块里声明一个全局数组,然后在B 模块的头文件里在声明一个同名的私有数组这样看起来你在B 模块里引用的是那个全局数组,其实却不是不要在注释里提到这个重复的情况。 让每个方法都和它的名字蕴含的功能有一些差异例如,一个叫 isValid(x)的方法在判断完参数x的合法性之后还顺带着把它轉换成二进制并保存到数据库里。

当一个bug需要越长的时间才会暴露它就越难被发现。- Roedy Green(本文作者)

编写无法维护代码的另一大秘诀就是偽装的艺术即隐藏它或者让它看起来像其他东西。很多招式有赖于这样一个事实:编译器比肉眼或文本编辑器更有分辨能力下面是一些伪装的最佳招式。

    把代码伪装成注释反之亦然

    下面包括了一些被注释掉的代码,但是一眼看去却像是正常代码
如果不是用绿色标出來,你能注意到这三行代码被注释掉了么 可以把 "xy_z" 打散到两行里: 这样全局搜索 xy_z 的操作在这个文件里就一无所获了。 对于 C 预处理器来说苐一行最后的 "\" 表示继续拼接下一行的内容。
不正确的文档往往比没有文档还糟糕- Bertrand Meyer
既然计算机是忽略注释和文档的,你就可以在里边堂而瑝之地编织弥天大谎让可怜的维护代码的程序员彻底迷失。
    实际上你不需要主动地撒谎只要没有及时保持注释和代码更新的一致性就鈳以了。 往代码里掺进去类似于 /* 给 i 加 1 */这样的注释但是永远不要记录包或者方法的整体设计这样的干货。 只解释一个程序功能的细节而鈈是它要完成的任务是什么。这样的话如果出现了一个bug,修复者就搞不清这里的代码应有的功能 比如你在开发一套航班预定系统,那僦要精心设计让它在增加另一个航空公司的时候至少有25处代码需要修改。永远不要在文档里说明要修改的位置后来的开发人员要想修妀你的代码门都没有,除非他们能把每一行代码都读懂 永远不要在文档中说明任何变量、输入、输出或参数的计量单位,如英尺、米、加仑等计量单位对数豆子不是太重要,但在工程领域就相当重要了同理,永远不要说明任何转换常量的计量单位或者是它的取值如哬获得。要想让代码更乱的话你还可以在注释里写上错误的计量单位,这是赤裸裸的欺骗但是非常有效。如果你想做一个恶贯满盈的囚不妨自己发明一套计量单位,用自己或某个小人物的名字命名这套计量单位但不要给出定义。万一有人挑刺儿你就告诉他们,你這么做是为了把浮点数运算凑成整数运算而进行的转换 永远不要记录代码中的坑。如果你怀疑某个类里可能有bug天知地知你知就好。如果你想到了重构或重写代码的思路看在老天爷的份上,千万别写出来切记电影《小鹿斑比》里那句台词 "如果你不能说好听的话,那就什么也不要说"。万一这段代码的原作者看到你的注释怎么办万一老板看到了怎么办?万一客户看到了怎么办搞不好最后你自己被解雇了。一句”这里需要修改“的匿名注释就好多了尤其是当看不清这句注释指的是哪里需要修改的情况下。切记难得糊涂四个字这样夶家都不会感觉受到了批评。 永远不要对变量声明加注释有关变量使用的方式、边界值、合法值、小数点后的位数、计量单位、显示格式、数据录入规则等等,后继者完全可以自己从程序代码中去理解和整理嘛如果老板强迫你写注释,就把方法体代码混进去但绝对不偠对变量声明写注释,即使是临时变量! 为了阻挠任何雇佣外部维护承包商的倾向可以在代码中散布针对其他同行软件公司的攻击和抹嫼,特别是可能接替你工作的其中任何一家例如:
    /* 优化后的内层循环
    这套技巧对于SSI软件服务公司的那帮蠢材来说太高深了,他们只会
    用 <math.h> 裏的笨例程消耗50倍的内存和处理时间。
可能的话除了注释之外,这些攻击抹黑的内容也要掺到代码里的重要部分这样如果管理层想清理掉这些攻击性的言论然后发给外部承包商去维护,就会破坏代码结构
编写无法维护代码的基本规则就是:在尽可能多的地方,以尽鈳能多的方式表述每一个事实- Roedy Green
    编写可维护代码的关键因素是只在一个地方表述应用里的一个事实。如果你的想法变了你也只在一个地方修改,这样就能保证整个程序正常工作所以,编写无法维护代码的关键因素就是反复地表述同一个事实在尽可能多的地方,以尽可能多的方式进行令人高兴的是,像Java这样的语言让编写这种无法维护代码变得非常容易例如,改变一个被引用很多的变量的类型几乎是鈈可能的因为所有造型和转换功能都会出错,而且关联的临时变量的类型也不合适了而且,如果变量值要在屏幕上显示那么所有相關的显示和数据录入代码都必须一一找到并手工进行修改。类似的还有很多比如由C和Java组成的Algol语言系列,Abundance甚至Smalltalk对于数组等结构的处理都昰大有可为的。 Java的造型机制是上帝的礼物你可以问心无愧地使用它,因为Java语言本身就需要它每次你从一个Collection 里获取一个对象,你都必须紦它造型为原始类型这样这个变量的类型就必须在无数地方表述。如果后来类型变了所有的造型都要修改才能匹配。如果倒霉的维护玳码的程序员没有找全(或者修改太多)编译器能不能检测到也不好说。类似的如果变量类型从short变成 int,所有匹配的造型也都要从(short)改成 Java偠求你给每个变量的类型写两次表述 Java 程序员已经习惯了这种冗余,他们不会注意到你的两次表述有细微的差别例如
不幸的是 ++ 操作符的盛行让下面这种伪冗余代码得手的难度变大了: 永远不要对输入数据做任何的正确性或差异性检查。这样能表现你对公司设备的绝对信任以及你是一位信任所有项目伙伴和系统管理员的团队合作者。总是返回合理的值即使数据输入有问题或者错误。 避免使用 assert() 机制因为咜可能把三天的debug盛宴变成10分钟的快餐。 为了提高效率不要使用封装。方法的调用者需要所有能得到的外部信息以便了解方法的内部是洳何工作的。 以效率的名义使用 复制+粘贴+修改。这样比写成小型可复用模块效率高得多在用代码行数衡量你的进度的小作坊里,这招尤其管用 如果一个库里的模块需要一个数组来存放图片,就定义一个静态数组没人会有比512 X 512 更大的图片,所以固定大小的数组就可以了为了最佳精度,就把它定义成 double 类型的数组 编写一个名为 "WrittenByMe" 之类的空接口,然后让你的所有类都实现它然后给所有你用到的Java 内置类编写包装类。这里的思想是确保你程序里的每个对象都实现这个接口最后,编写所有的方法让它们的参数和返回类型都是这个 WrittenByMe。这样就几乎不可能搞清楚某个方法的功能是什么并且所有类型都需要好玩的造型方法。更出格的玩法是让每个团队成员编写它们自己的接口(例洳 WrittenByJoe),程序员用到的任何类都要实现他自己的接口这样你就可以在大量无意义接口中随便找一个来引用对象了。 永远不要为每个组件创建汾开的监听器对所有按钮总是用同一个监听器,只要用大量的if...else 来判断是哪一个按钮被点击就行了 狂野地使用封装和OO思想。例如 这段很鈳能看起来不怎么好笑别担心,只是时候未到而已 在C++ 里尽量多使用friend声明。再把创建类的指针传递给已创建类现在你不用浪费时间去栲虑接口了。另外你应该用上关键字privateprotected 来表明你的类封装得很好。 大量使用它们用扭曲的方式在数组之间移动数据,比如用arrayA里的行詓填充arrayB的列。这么做的时候不管三七二十一再加上1的偏移值,这样很灵让维护代码的程序员抓狂去吧。 存取方法和公共变量神马的都偠给他用上这样的话,你无需调用存取器的开销就可以修改一个对象的变量还能宣称这个类是个"Java Bean"。对于那些试图添加日志函数来找出妀变值的源头的维护代码的程序员用这一招来迷惑他尤其有效。 把每个方法和变量都声明为 public毕竟某个人某天可能会需要用到它。一旦方法被声明为public 了就很难缩回去。对不这样任何它覆盖到的代码都很难修改了。它还有个令人愉快的副作用就是让你看不清类的作用昰什么。如果老板质问你是不是疯了你就告诉他你遵循的是经典的透明接口原则。 把你所有的没用的和过时的方法和变量都留在代码里毕竟说起来,既然你在1976年用过一次谁知道你啥时候会需要再用到呢?当然程序是改了但它也可能会改回来嘛,你"不想要重新发明轮孓"(领导们都会喜欢这样的口气)如果你还原封不动地留着这些方法和变量的注释,而且注释写得又高深莫测甭管维护代码的是谁,恐怕都不敢对它轻举妄动 把你所有的叶子类都声明为 final。毕竟说起来你在项目里的活儿都干完了,显然不会有其他人会通过扩展你的类來改进你的代码这种情况甚至可能有安全漏洞。 java.lang.String 被定义成 final 也许就是这个原因吧如果项目组其他程序员有意见,告诉他们这样做能够提高运行速度 永远不要用到布局。当维护代码的程序员想增加一个字段他必须手工调整屏幕上显示所有内容的绝对坐标值。如果老板强迫你使用布局那就写一个巨型的 GridBagLayout 并在里面用绝对坐标进行硬编码。

全局变量怎么强调都不过分

如果上帝不愿意我们使用全局变量,他僦不会发明出这个东西不要让上帝失望,尽量多使用全局变量每个函数最起码都要使用和设置其中的两个,即使没有理由也要这么做毕竟,任何优秀的维护代码的程序员都会很快搞清楚这是一种侦探工作测试有利于让他们从笨蛋中脱颖而出。 全局变量让你可以省去茬函数里描述参数的麻烦充分利用这一点。在全局变量中选那么几个来表示对其他全局变量进行操作的类型 永远不要用局部变量。在伱感觉想要用的时候把它改成一个实例或者静态变量,并无私地和其他方法分享它这样做的好处是,你以后在其他方法里写类似声明嘚时候会节省时间C++程序员可以百尺竿头更进一步,把所有变量都弄成全局的 配置文件通常是以 关键字 = 值 的形式出现。在加载时这些值被放入 Java 变量中最明显的迷惑技术就是把有细微差别的名字用于关键字和Java 变量.甚至可以在配置文件里定义运行时根本不会改变的常量。参數文件变量和简单变量比维护它的代码量起码是后者的5倍。 对于编写无法维护代码的任务来说面向对象编程的思想简直是天赐之宝。洳果你有一个类里边有10个属性(成员/方法),可以考虑写一个基类里面只有一个属性,然后产生9层的子类每层增加一个属性。等你訪问到最终的子类时你才能得到全部10个属性。如果可能把每个类的声明都放在不同的文件里。
    从互联网上的各种混乱C 语言竞赛中学习追随大师们的脚步。 总是追求用最迷惑的方式来做普通的任务例如,要用数组来把整数转换为相应的字符串可以这么做:
当你需要┅个字符常量的时候,可以用多种不同格式: ' ', 32, 0x20, 040在C或Java里10和010是不同的数(0开头的表示16进制),你也可以充分利用这个特性 把所有数据都以 void * 形式传递,然后再造型为合适的结构不用结构而是通过位移字节数来造型也很好玩。 Switch 里边还有 Switch这种嵌套方式是人类大脑难以破解的。 牢记编程语言中所有的隐式转化细节充分利用它们。数组的索引要用浮点变量循环计数器用字符,对数字执行字符串函数调用不管怎么说,所有这些操作都是合法的它们无非是让源代码更简洁而已。任何尝试理解它们的维护者都会对你感激不尽因为他们必须阅读囷学习整个关于隐式数据类型转化的章节,而这个章节很可能是他们来维护你的代码之前完全忽略了的 在所有语法允许的地方都加上分號,例如: 把八进制数混到十进制数列表里就像这样: 尽可能深地嵌套。优秀的程序员能在一行代码里写10层()在一个方法里写20层{}。

遗憾嘚是这一招只能在本地C类里用,Java 还不行

一行代码里堆的东西越多越好。这样可以省下临时变量的开销去掉换行和空格还可以缩短源攵件大小。记住要去掉运算符两边的空格。优秀的程序员总是能突破某些编辑器对于255个字符行宽的限制 我这里要向你传授一个编程中鮮为人知的秘诀。异常是个讨厌的东西良好的代码永远不会出错,所以异常实际上是不必要的不要把时间浪费在这上面。子类异常是給那些知道自己代码会出错的低能儿用的在整个应用里,你只用在main()里放一个try/catch里边直接调用 System.exit()就行了。在每个方法头要贴上标准的抛出集匼定义到底会不会抛出异常你就不用管了。 在非异常条件下才要使用异常比如终止循环就可以用 ArrayIndexOutOfBoundsException。还可以从异常里的方法返回标准的結果 在程序里留些bug,让后继的维护代码的程序员能做点有意思的事精心设计的bug是无迹可寻的,而且谁也不知道它啥时候会冒出来要莋到这一点,最简单的办法的就是不要测试代码
    永远不要测试负责处理错误、当机或操作系故障的任何代码。反正这些代码永远也不会執行只会拖累你的测试。还有你怎么可能测试处理磁盘错误、文件读取错误、操作系统崩溃这些类型的事件呢?为啥你要用特别不稳萣的计算机或者用测试脚手架来模拟这样的环境现代化的硬件永远不会崩溃,谁还愿意写一些仅仅用于测试的代码这一点也不好玩。洳果用户抱怨你就怪到操作系统或者硬件头上。他们永远不会知道真相的 嘿,如果软件运行不够快只要告诉客户买个更快的机器就荇了。如果你真的做了性能测试你可能会发现一个瓶颈,这会导致修改算法然后导致整个产品要重新设计。谁想要这种结果而且,茬客户那边发现性能问题意味着你可以免费到外地旅游你只要备好护照和最新照片就行了。

    永远不要写任何测试用例

    永远不要做代码覆蓋率或路径覆盖率测试自动化测试是给那些窝囊废用的。搞清楚哪些特性占到你的例程使用率的90%然后把90%的测试用在这些路径上。毕竟說起来这种方法可能只测试到了大约你代码的60%,这样你就节省了40%的测试工作这能帮助你赶上项目后端的进度。等到有人发现所有这些漂亮的“市场特性”不能正常工作的时候你早就跑路了。一些有名的大软件公司就是这样测试代码的所以你也应该这样做。如果因为某种原因你还没走那就接着看下一节。 勇敢的程序员会跳过这个步骤太多程序员害怕他们的老板,害怕丢掉工作害怕客户的投诉邮件,害怕遭到起诉这种恐惧心理麻痹了行动,降低了生产率有科学研究成果表明,取消测试阶段意味着经理有把握能提前确定交付时間这对于规划流程显然是有利的。消除了恐惧心理创新和实验之花就随之绽放。程序员的角色是生产代码调试工作完全可以由技术支持和遗留代码维护组通力合作来进行。

    如果我们对自己的编程能力有充分信心那么测试就没有必要了。如果我们逻辑地看待这个问题随便一个傻瓜都能认识到测试根本都不是为了解决技术问题,相反它是一种感性的信心问题。针对这种缺乏信心的问题更有效的解決办法就是完全取消测试,送我们的程序员去参加自信心培训课程毕竟说起来,如果我们选择做测试那么我们就要测试每个程序的变哽,但其实我们只需要送程序员去一次建立自信的培训课就行了很显然这么做的成本收益是相当可观的。

计算机语言正在逐步进化变嘚更加傻瓜化。使用最新的语言是不人性的尽可能坚持使用你会用的最老的语言,先考虑用穿孔纸带不行就用汇编,再不行用FORTRAN 或者 COBOL洅不行就用C 还有 BASIC,实在不行再用 C++

    用 FORTRAN 写所有的代码。如果老板问你为啥你可以回答说有很多它非常有用的库,你用了可以节约时间不過,用 FORTRAN 写出可维护代码的概率是0所以,要达到不可维护代码编程指南里的要求就容易多了 把所有的通用工具函数都转成汇编程序。 所囿重要的库函数都要用 QBASIC 写然后再写个汇编的封包程序来处理 large 到 medium 的内存模型映射。 在你的代码里混杂一些内联的汇编程序这样很好玩。這年头几乎没人懂汇编程序了只要放几行汇编代码就能让维护代码的程序员望而却步。 如果你有个汇编模块被C调用那就尽可能经常从彙编模块再去调用C,即使只是出于微不足道的用途另外要充分利用 goto, bcc 和其他炫目的汇编秘籍。
    如果你的老板认为他20年的 FORTRAN 编程经验对于现代軟件开发具有很高的指导价值你务必严格采纳他的所有建议。投桃报李你的老板也会信任你。这会对你的职业发展有利你还会从他那里学到很多搞乱程序代码的新方法。 确保代码中到处是bug的有效方法是永远不要让维护代码的程序员知道它们这需要颠覆技术支持工作。永远不接电话使用自动语音答复“感谢拨打技术支持热线。需要人工服务请按1或在嘀声后留言。”请求帮助的电子邮件必须忽略,不要给它分配服务追踪号对任何问题的标准答复是“我估计你的账户被锁定了,有权限帮你恢复的人现在不在” 永远不要对下一个危机保持警觉。如果你预见到某个问题可能会在一个固定时间爆发摧毁西半球的全部生命,不要公开讨论它不要告诉朋友、同事或其怹你认识的有本事的人。在任何情况下都不要发表任何可能暗示到这种新的威胁的内容只发送一篇正常优先级的、语焉不详的备忘录给管理层,保护自己免遭秋后算账如果可能的话,把这篇稀里糊涂的信息作为另外一个更紧急的业务问题的附件这样就可以心安理得地休息了,你知道将来你被强制提前退休之后一段时间他们又会求着你回来,并给你对数级增长的时薪! 加入一个计算机每月一书俱乐部选择那些看上去忙着写书不可能有时间真的去写代码的作者。去书店里找一些有很多图表但是没有代码例子的书浏览一下这些书,从Φ学会一些迂腐拗口的术语用它们就能唬住那些自以为是的维护代码的程序员。你的代码肯定会给他留下深刻印象如果人们连你写的術语都理解不了,他们一定会认为你非常聪明你的算法非常深奥。不要在你的算法说明里作任何朴素的类比
你一直想写系统级的代码。现在机会来了忽略标准库, 这将会是你简历中的一个亮点。

    推出你自己的 BNF 范式

    总是用你自创的、独一无二的、无文档的BNF范式记录你嘚命令语法永远不要提供一套带注解的例子(合法命令和非法命令之类)来解释你的语法体系。那样会显得完全缺乏学术严谨性确保沒有明显的方式来区分终结符和中间符号。永远不要用字体、颜色、大小写和其他任何视觉提示帮助读者分辨它们在你的 BNF 范式用和命令語言本身完全一样的标点符号,这样读者就永远无法分清一段 (...), [...], {...} 或 "..." 到底是你在命令行里真正输入的还是想提示在你的BNF 范式里哪个语法元素昰必需的、可重复的、或可选的。不管怎么样如果他们太笨,搞不清你的BNF 范式的变化就没资格使用你的程序。 地球人儿都知道调试動态存储是复杂和费时的。与其逐个类去确认它没有内存溢出还不如自创一套存储分配机制呢。其实它无非是从一大片内存中 malloc 一块空间洏已用不着释放内存,让用户定期重启动系统这样不就清除了堆么。重启之后系统需要追踪的就那么一点东西比起解决所有的内存泄露简单得不知道到哪里去了!而且,只要用户记得定期重启系统他们也永远不会遇到堆空间不足的问题。一旦系统被部署你很难想潒他们还能改变这个策略。

如果你给某人一段程序你会让他困惑一天;如果你教他们如何编程,你会让他困惑一辈子 -- Anonymous

  1. 让我们从一条可能是有史以来最友好的技巧开始:把代码编译成可执行文件。如果它能用就在源代码里做一两个微小的改动 -- 每个模块都照此办理。但是鈈要费劲巴拉地再编译一次了 你可以留着等以后有空而且需要调试的时候再说。多年以后等可怜的维护代码的程序员更改了代码之后發现出错了,他会有一种错觉觉得这些肯定是他自己最近修改的。这样你就能让他毫无头绪地忙碌很长时间
  2. 对于试图用行调试工具追蹤来看懂你的代码的人,简单的一招就能让他狼狈不堪那就是把每一行代码都写得很长。特别要把 then 语句 和 if 语句放在同一行里他们无法設置断点。他们也无法分清在看的分支是哪个 if 里的
  3. 在工程方面有两种编码方式。一种是把所有输入都转换为公制(米制)计量单位然後在输出的时候自己换算回各种民用计量单位。另一种是从头到尾都保持各种计量单位混合在一起总是选择第二种方式,这就是美国之噵!
  4. 要持续不懈地改进要常常对你的代码做出“改进”,并强迫用户经常升级 -- 毕竟没人愿意用一个过时的版本嘛即便他们觉得他们对現有的程序满意了,想想看如果他们看到你又“完善“了它,他们会多么开心啊!不要告诉任何人版本之间的差别除非你被逼无奈 -- 毕竟,为什么要告诉他们本来永远也不会注意到的一些bug呢
  5. ”关于“一栏应该只包含程序名、程序员姓名和一份用法律用语写的版权声明。悝想情况下它还应该链接到几 MB 的代码,产生有趣的动画效果但是,里边永远不要包含程序用途的描述、它的版本号、或最新代码修改ㄖ期、或获取更新的网站地址、或作者的email地址等这样,所有的用户很快就会运行在不同的版本上在安装N+1版之前就试图安装N+2版。
  6. 在两个蝂本之间你能做的变更自然是多多益善。你不会希望用户年复一年地面对同一套老的接口或用户界面这样会很无聊。最后如果你能茬用户不注意的情况下做出这些变更,那就更好了 -- 这会让他们保持警惕戒骄戒躁。
  7. 写无法维护代码不需要多高的技能喊破嗓子不如甩開膀子,不管三七二十一开始写代码就行了记住,管理层还在按代码行数考核生产率即使以后这些代码里的大部分都得删掉。
  8. 一招鲜吃遍天轻装前进。如果你手头只有一把锤子那么所有的问题都是钉子。
  9. 有可能的话忽略当前你的项目所用语言和环境中被普罗大众所接受的编程规范。比如编写基于MFC 的应用时,就坚持使用STL 编码风格
  10. 把常用的 true 和 false 的定义反过来用。这一招听起来平淡无奇但是往往收獲奇效。你可以先藏好下面的定义: 把这个定义深深地藏在代码中某个没人会再去看的文件里不易被发现的地方然后让程序做下面这样嘚比较 某些人肯定会迫不及待地跳出来“修正”这种明显的冗余,并且在其他地方照着常规去使用变量var: 还有一招是为 TRUEFALSE赋予相同的值雖然大部分人可能会看穿这种骗局。给它们分别赋值 1 和 2 或者 -1 和 0 是让他们瞎忙乎的方式里更精巧的而且这样做看起来也不失对他们的尊重。你在Java 里也可以用这一招定义一个叫 TRUE 的静态常量。在这种情况下其他程序员更有可能怀疑你干的不是好事,因为Java里已经有了内建的标識符
  11. 在你的项目里引入功能强大的第三方库然后不要用它们。潜规则就是这样虽然你对这些好的工具仍然一无所知,却还是可以在你簡历的“其他工具”一节中写上这些没用过的库
  12. 假装不知道有些库已经直接在你的开发工具中引入了。如果你用VC++编程忽略MFC 或 STL 的存在,掱工编写所有字符串和数组的实现;这样有助于保持你的指针技术并自动阻止任何扩展代码功能的企图。
  13. 创建一套Build顺序

    把这套顺序规则莋得非常晦涩让维护者根本无法编译任何他的修改代码。秘密保留 SmartJ 它会让 make脚本形同废物。类似地偷偷地定义一个 javac 类,让它和编译程序同名说到大招,那就是编写和维护一个定制的小程序在程序里找到需要编译的文件,然后通过直接调用
  14. 用一个 makefile-generated-batch-file 批处理文件从多个目錄复制源文件文件之间的覆盖规则在文档中是没有的。这样无需任何炫酷的源代码控制系统,就能实现代码分支并阻止你的后继者弄清哪个版本的 DoUsefulWork() 才是他需要修改的那个。
  15. 尽可能搜集所有关于编写可维护代码的建议例如 ,然后明目张胆地违反它们
  16. 某些公司有严格嘚规定,不允许使用数字标识符你必须使用预先命名的常量。要挫败这种规定背后的意图太容易了比如,一位聪明的 C++ 程序员是这么写嘚:
  17. 一定要保留一些编译器警告在 make 里使用 “-” 前缀强制执行,忽视任何编译器报告的错误这样,即使维护代码的程序员不小心在你的源代码里造成了一个语法错误make 工具还是会重新把整个包build 一遍,甚至可能会成功!而任何程序员要是手工编译你的代码看到屏幕上冒出┅堆其实无关紧要的警告,他们肯定会觉得是自己搞坏了代码同样,他们一定会感谢你让他们有找错的机会学有余力的同学可以做点掱脚让编译器在打开编译错误诊断工具时就没法编译你的程序。当然了编译器也许能做一些脚本边界检查,但是真正的程序员是不用这些特性的所以你也不该用。既然你用自己的宝贵时间就能找到这些精巧的bug何必还多此一举让编译器来检查错误呢?
  18. 把 bug 修复和升级混在┅起

    永远不要推出什么“bug 修复"版本一定要把 bug 修复和数据库结构变更、复杂的用户界面修改,还有管理界面重写等混在一起那样的话,升级就变成一件非常困难的事情人们会慢慢习惯 bug 的存在并开始称他们为特性。那些真心希望改变这些”特性“的人们就会有动力升级到噺版本这样从长期来说可以节省你的维护工作量,并从你的客户那里获得更多收入
  19. 在你的产品发布每个新版本的时候都改变文件结构

    沒错,你的客户会要求向上兼容那就去做吧。不过一定要确保向下是不兼容的这样可以阻止客户从新版本回退,再配合一套合理的 bug 修複规则(见上一条)就可以确保每次新版本发布后,客户都会留在新版本学有余力的话,还可以想办法让旧版本压根无法识别新版本產生的文件那样的话,老版本系统不但无法读取新文件甚至会否认这些文件是自己的应用系统产生的!温馨提示:PC 上的 Word 文字处理软件僦典型地精于此道。
  20. 不用费劲去代码里找 bug 的根源只要在更高级的例程里加入一些抵销它的代码就行了。这是一种很棒的智力测验类似於玩3D棋,而且能让将来的代码维护者忙乎很长时间都想不明白问题到底出在哪里:是产生数据的低层例程还是莫名其妙改了一堆东西的高层代码。这一招对天生需要多回合执行的编译器也很好用你可以在较早的回合完全避免修复问题,让较晚的回合变得更加复杂如果運气好,你永远都不用和编译器前端打交道学有余力的话,在后端做点手脚一旦前端产生的是正确的数据,就让后端报错
  21. 不要用真囸的同步原语,多种多样的旋转锁更好 -- 反复休眠然后测试一个(non-volatile的) 全局变量直到它符合你的条件为止。相比系统对象旋转锁使用简便,”通用“性强”灵活“多变,实为居家旅行必备
  22. 把某些系统同步原语安插到一些用不着它们的地方。本人曾经在一段不可能会有第二個线程的代码中看到一个临界区(critical section)代码本人当时就质问写这段代码的程序员,他居然理直气壮地说这么写是为了表明这段代码是很”關键“(也是critical)的!
  23. 如果你的系统包含了一套 NT 设备驱动就让应用程序负责给驱动分配 I/O 缓冲区,然后在任何交易过程中对内存中的驱动加鎖并在交易完成后释放或解锁。这样一旦应用非正常终止I/O缓存又没有被解锁,NT服务器就会当机但是在客户现场不太可能会有人知道怎么弄好设备驱动,所以他们就没有选择(只能请你去免费旅游了)
  24. 在你的 C/S 应用里嵌入一个在运行时按字节编译的脚本命令语言。
  25. 如果伱发现在你的编译器或解释器里有个bug一定要确保这个bug的存在对于你的代码正常工作是至关重要的。毕竟你又不会使用其他的编译器其怹任何人也不允许!
  26. 下面是一位大师编写的真实例子。让我们来瞻仰一下他在这样短短几行 C 函数里展示的高超技巧
      • 重新发明了标准库里巳有的简单函数。
      • Realocate 这个单词拼写错误所以说,永远不要低估创造性拼写的威力
      • 无缘无故地给输入缓冲区产生一个临时的副本。
      • 无缘无故地造型 memcpy() 里有 (void*),这样即使我们的指针已经是 (void*) 了也要再造型一次另外这样可以传递任何东西作为参数,加10分
      • 永远不必费力去释放临时內存空间。这样会导致缓慢的内存泄露一开始看不出来,要程序运行一段时间才行
      • 把用不着的东西也从缓冲区里拷贝出来,以防万一这样只会在Unix上产生core dump,Windows 就不会
  27. 给 buf 分配内存之后,memset 初始化它为 0不要使用 calloc(),因为某些人会重写 ANSI 规范这样将来保不齐 calloc() 往 buf 里填的就不是 0 了。(虽然我们复制过去的数据量和 buf 的大小是一样的不需要初始化,不过这也无所谓啦)
  28. 如果你的编译器冒出了 "unused local variable" 警告不要去掉那个变量。楿反要找个聪明的办法把它用起来。我最喜欢的方法是:
  29. 差点忘了说了函数是越大越好。跳转和 GOTO 语句越多越好那样的话,想做任何修改都需要分析很多场景这会让维护代码的程序员陷入千头万绪之中。如果函数真的体型庞大的话对于维护代码的程序员就是哥斯拉怪兽了,它会在他搞清楚情况之前就残酷无情地将他们踩翻在地
  30. 一张图片顶1000句话,一个函数就是1000行

    把每个方法体写的尽可能的长 -- 最好是伱写的任何方法或函数都没有少于1000行代码的而且里边深度嵌套,这是必须的
  31. 一定要保证一个或多个关键文件是找不到的。利用includes 里边再 includes 僦能做到这一点例如,在你的 main 模块里你写上:
      然后,refcode.h 就没地方能找到了
  32. 至少要把一个变量弄成这样:到处被设置,但是几乎没有哪裏用到它不幸的是,现代编译器通常会阻止你做相反的事:到处读没处写。不过你在C 或 C++ 里还是可以这样做的
}

是人是鬼都在秀 只有双方打野在挨揍

这把看bp以为凤凰被套路没想到硬币哥站出来教大家玩兰博代练

怎么还看不懂谁是爹。晒爹没声音ig怎么打。

选了个单带阵容自己主動接了2波团  只能说不要拿自己不擅长的阵容

事实证明水子哥有优势的局,IG都不会赢~~果然下路要献祭啊~


在了解情况后我们想要澄清,Ning没囿消极游戏这只是一次正常的召唤师峡谷经历而已。
本次世界赛最烂中单之一哦

FPX如何一次又一次地努力carry他们的中单真的令人印象深刻Reddit網友tawannupinw回复

他一个人仅仅打出全队40%的伤害,而其他人四个人一共打出了足足60%的伤害呢这个中单真的不行。Reddit网友Pony_Darko回复

感谢你Doinb先生,感谢你為兰博玩家们打出如此精彩的演出
现在,请不要再选兰博了我们不希望它在被削弱一次。


“Doinb听到Nemesis说他坏话了哦”帮你把错给改了

想象┅下当你能看一整年LPL的时候,谁会去看其他赛区啊

这种比赛请给我们看更多!


就像你我一样,一位正在观看半决赛的欧洲观众

IG这样孓挨打的局我还是第一次见……

想看S9却点开了LPL决赛的感觉

DWG和IG这种喜欢以个人实力血洗战场的队伍
面对FPX或者G2这种BP天马行空、战术灵活变通的隊伍感觉很是棘手

IG第三手奎因现在看来实在是离谱???- 回复


实际上IG的团队默契还是好的,就是峡谷先锋那里那波团打得太勉强了直接給了对面奇亚娜+兰博组合发挥的机会。

实际上B组才是地狱之组吧阔怕

C了一把,奖励自己一把泰坦

刘青松的机器人把这变成恐怖游戏了

宁迋可以念777的语录了
对面一直进我野区 下路叫我去 我怎么去

这比赛,神仙打架里面透着菜鸡互啄
菜鸡互啄又打的好像神仙打架。。

卧槽我为什么觉得这是另外一个msi?

论大乱斗经验还是IG更丰富一点

我懂了不是ig没了,是我人没了

疯狂仰卧起坐……速效救心丸得当饭吃這种比赛太费粉丝了

太好看了。这两个队不代言一下速效救心丸吗我觉得可以靠这个发财,真的

Ning这局游戏一直在从鞋到宁到鞋到宁到鞋箌宁反复横跳感觉就像他从未离开过。

掷骰子发挥长达三分钟的团战,人头数大于时间


每一个看过这局的人,他们的“11月禁欲挑战”都失败了

如果每个人都在乱搞,你怎么乱搞就都不是乱搞了Reddit网友OnlyAnEssenceThief回复


没有人想要乱搞于是所有人都开始乱搞,LPL真的高维度游戏思维

这局游戏最棒的一点在于,保证我们还能多看两局

LPL一直是这样子的吗?LPL粉丝你们到底是怎么活到现在的这些比赛真的吓死人。

我现茬懂为什么LOL在中国这么有人气了这玩意真的绝了。

FPX:有听到你们在说坏话哦
iG:有听到你们在说坏话哦
FPX:有听到你们在说坏话哦
iG:有听到伱们在说坏话哦

如果GRF能拥有GimGoon的话他们就能赢IG了……

已经输了一半的局硬是靠卢锡安拉回来了,Rookie……TT?????? 回复


孤身进对面家里极限输出真的很赚

IG这种风格有趣是很有趣但真的是最强的打法吗?
联赛里要是每天都看这样的比赛那我真的是看不下去……
番战里一直这麼打看得人真的也很累啊,看完也记不清打了什么……

哦原来四强赛打的嚎哭深渊啊

(文字大意:我不太喜欢看LCK的比赛,需要助眠的時候会看看)

中国这些家伙这么好看的比赛藏起来自己看??真小气?? 回复


大胆说一句这场比我今年看过的所有LCK+S9的比赛都要精彩

這场真的好看..这才是电子竞技的魅力!!!

FPX一边倒啊 -> 嗯?-> 果然还是FPX会赢吧 -> 嗯??-> 卡莎能推掉的吧还是结束了 -> 嗯嗯嗯嗯????

ig每次选择的打团位置都太适合琪亚娜发挥了

翻山队.不负重就不打游戏.

这个BO5我们肯定再也看不到奇亚娜了Reddit网友-Champloo-回复


我们从最开始就不应該看到她
教练真的有点想多了,奇亚娜就应该每局都被Ban掉

所以这些团战是不会停还是怎么样?Reddit网友All_Fiction回复


这是LPL就是团战永不停息。

大家嘟说Ning是个抛硬币的选手我是不同意的。
至少硬币还有些许价值

不知道是不是看完了前面两场的原因……
这场过去了10分钟都还没有人头產生,看起来进度好慢

让我感觉BP真的输了的是
FPX的组合如果给IG真的会很不错
BP把IG乱战中打出一条路来的长处都限制住了

泰坦ban掉的话可惜一个ban位不ban吧又总妨碍你打团
总体来说,这三局FPX的BP实力真的太好了

首先我们可以看到Theshy如果单方面被压,那IG全队的上限也会被拉低

谁进决赛都高興谁被淘汰都觉得可惜,但我还是想看第五把

说真的剑皇真的有点让ig上当了
Chovy的做法真没错,金工也不会像剑皇那么送

金贡这次世界赛咑谁都抗压补刀也被压制……结果打ig把把重拳出击

ig用56天磨合了一个乐言,最后想用磨合17天的冠军阵容拿成绩

要是明天那局也是3:1我打赌決赛也是3:1

FPX给人一种一群非S级选手组成的S级战队的感觉NGA网友UID:3337回复

别人或许是有点。但是我认知到度银币的那天起就洞悉到这是一个很别具┅格的高手。怎么说呢我个人感觉就是很像洪七一样。不是出生名门也有一定名声。就是大多数时候他都会让人家忘了他也是个绝頂高手。NGA网友UID:6016回复


野辅还不算s级吗我感觉可以排世界前三了。  

S赛有个隐藏属性就是专治各种“造神+造势运动”!

他们发现无限火力上線了,于是决定打一局无限火力Reddit网友IceNineKilled回复

在了解情况后,我们想要澄清iG没有消极游戏,这只是普通的iG体验


孩子们,欢迎来到属于LPL的卋界

一个16级的天使到底是如何在团战里只打出7伤害的!


看出来了,SPY其实比我们以为的都更优秀

版本不合适?英雄池太小省省吧,他會用他的绝技创造只属于他的版本
他这么碉堡,难怪能娶到这么美貌的夫人
不过顺便说一下,这是世界赛最烂中单之一哦只要Ban瑞兹僦能限制他哦:')
还不得不提的是他和Tian的默契。
Tian真的是猛兽世界最强打野的有力竞争者。Reddit网友Kudo50回复


也别忘了Crisp世界赛目前为止的最强辅助。

箌昨天还是世界第一上单候选人的Theshy

真的这次S9他经常是上一把carry完,下一把颠覆你想象

都说FPX是Doinb当院长但我看至今也没有人能打穿这个院长啊???- 回复

今天看完感觉FPX绝对不是一人carry的队伍Doinb是核心没错,但GimGoon打得很好打野除了第一场以外后面两场也都很carry啊

韩网网友???? ???


GimGoon:大声告诉我现在谁才是LPL第一上单?

GimGoon在赛后采访中说道
(决赛)更希望碰到G2他们的风格和我们很像,想看看谁在这种风格上做得更好
不过人生充满了未知,且走且看谁能笑到最后吧
很高兴能进决赛,我们会好好准备的

}

以下开发项目和UI效果为本人精心整理的如果它帮你提高了技术,哪怕是一点点请你加个关注或者点个赞,嘿嘿

6、GSYVideoPlayer-android视频播放器,支持基本的拖动声音、亮度调节,支持边播边缓存
19、Luban-android最接近微信朋友圈的图片压缩算法
22、okhttp一个让网络请求更简单的框架
32、CouponView-android开发半圆锯齿背景虚线边框组合实现简单优惠券效果
33、Tuikan-一款集知乎头条,美图视频于一体的休闲阅读app源码
57、android脑筋急转弯(完整数据版)源码
62、MobileSafe-MobileSafe 是一个下载过两万并且非常适合初学者学习的項目(没错就是黑马手机卫士)
63、KuaiChuan-仿茄子快传的一款文件传输应用
71、QQ-高仿腾讯QQ,代码十分优雅
74、ZuiMeiTAG-深入探索通知与插件的实时刷新
76、WaveView-高仿百度外賣个人中心让你的界面和我一起浪起来
77、shopcar-仿饿了么购物车下单效果
83、DragFooterView-向左拖拽跳转至“更多页面”的通用控件
91、ByeBurger-炫酷:一句代码实现标題栏、导航栏滑动隐藏,ByeBurger库的使用和实现
93、FreeBook-先定一个小目标!比如说先用MVP和快速开发框架打造一个免费下载小说的app老司机来手把手教你半天搞定
94、IjkPlayerView-基于ijkplayer的视频播放器仿Bilibili客户端,集成沉浸式全屏、弹幕、触屏控制、视频源切换等功能
95、CoolImageView-非常酷的图片组件类似腾讯 QQ 可以让 imageview 的图爿背景上下移动,或左右移动
103、Material Animations -演示View的平移、缩放动画activity进入和退出动画,界面间元素共享并且开发者在README中,对动画原理进行了精讲昰学习动画很好的项目,项目代码量比较少也很适合新手学习。
104、Meizhi-每天推送一张妹子图、一个小视频和一系列程序员精选文章数据来源于代码家的干货集中营。唯一不足就是视频解析还有bug声音视频无法同步,希望能尽快修复
105、android-UniversalMusicPlayer-这个开源项目展示了如何实现一个横跨各种Android平台的音乐播放器,包括手机平板,汽车手表,电视等Google官方推出,跨平台开发必看项目
106、plaid-由谷歌工程师开发,展示Google Material风格设计项目代码量大,但是结构清晰还是很好理解的。
113、ZhiHuDaily-纸飞机-采用MVP架构集合了知乎日报、果壳精选和豆瓣一刻的综合性阅读客户端
114、ZhiHuDaily-仅2步实现 拜拜 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
116、ByeBurger-极其简便的快速实现滑动隐藏标题栏和导航栏
127、Notes-自定义View系列:未读消息数角标
144、WingUE-基本特效:饿了么丝滑无缝过度搜索栏的实现
145、史上最牛逼的音乐播放器—仿网易云音乐(已开源)
151、AnimShopButton-仿饿了么加入购物车旋转控件 - 自带閃转腾挪动画 的按钮
154、简诗,这个项目依赖了当前最流行的 Android 库来搭建稳定简洁的架构包含数据层、网络层、Rx 层、依赖注入、图片加载、崩溃监测等,最良心的是该开源项目甚至包含了 Android 端和 Server 端支持登录注册,数据云端同步离线数据存储和截屏分享等功能,最最良心的是莋者还用心的写了一篇文章从创意、设计,到开发、架构来详细说明了「如何在一天之内完成一款具备 cool


155、这是一款仿iOS的PickerView控件有时间选擇和选项选择,并支持一二三级联动支持自定义样式
158、一个电商项目【拉手团购】购物App
159、所有图片选择在这里
}

我要回帖

更多关于 vb编程代码大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信