开发者常见的十大编程坏习惯朋友们,你有没有问过自己:你有多少次违反了编程的基本规范?也许您没有意识到自己经常犯下的不良编程习惯。事实上,我们交付编译后的代码后,客户在使用过程中并不会立即发现程序的缺陷。通常,编程规则只是规定了程序员在编写代码时需要遵循的准则和推荐的风格,而不是需要详细遵循的不变指令。因此,即使偶尔“犯规”,也不可怕。可怕的是不认真总结,甚至充耳不闻。下面,我将讨论十种常见的不良编程习惯。不良编程习惯一:直接复制操作请不要将别人的代码直接复制粘贴到自己的程序中,尤其是那些已经标明版权信息的专有代码。请在理解的基础上打出自己的版本。毕竟,你的老板或客户不会付钱让你复制和粘贴。当然,在代码可靠性方面,我们通常应该从经过原作者深思熟虑和反复测试的信誉良好的来源获取源代码。为了避免重新发明轮子,许多原创者在各种在线编程论坛上共享和开源他们的代码。但是,有时它们可??能带有许可证(例如BSD或MIT),并且限制使用范围。此外,一些程序往往是针对特定的难题而开发的。难免会有一些未被发现的错误,或者对特定情况的假设和约束。如果你只是简单地将它添加到你自己的代码段中,很可能会出现空指针,或者潜在的错误,例如无限循环。并且由于原始代码没有预见到你的使用环境,可能会出现“水土不服”,甚至执行结果不尽如人意的情况。不良编程习惯2:非函数式代码函数式范式在过去十年中取得了长足的进步。多项研究证明,与老式的变量和循环模式相比,使用嵌套函数调用构建程序时,程序代码本身更安全且错误更少。因此,资深程序员往往通过review代码和push-pull请求的方式来发现非功能代码,从而使程序的结构更加合理和协调。不要试图一次设计一个全面的架构。毕竟,细致的分层设计、复杂的界面导航、构建的配套代码,都需要提前给程序员提供充裕的时间,以及昂贵的费用。因此,为了保证所有必要的数据都能被正确定义并通过准确的通道传输,使整个系统高效运行,我们应该尽量保持代码的简洁和直观,不要留下各种非功能代码的冗长。编程坏习惯三:间距不规范众所周知,除了Python等少数编程语言使用空格间距来标识代码块外,大多数程序中的空格一般不会影响软件行为和整体性能。即便如此,我们还是要抱着一种“强迫症”的态度,要求自己不要写“不规范的代码(NonStandardCode)”,尤其是等号两边不要留空格,以免违反了ESLintspace-infix-ops规则。有时,过多的空格会导致数据库超载,甚至会因为空指针导致程序崩溃。因此,在一些要求较高的软件开发公司,他们会成立一个标准委员会来规范各种空格或制表符在代码和页面中的允许位置。在实际的编程过程中,开发人员往往更注重程序的功能和效果,而忽略了间距、空格等格式问题。然而,幸运的是:有几种工具可以帮助您自动格式化代码并遵循各种预定义的插入规则。错误的编程习惯4:使用goto早在结构化编程工具出现之前,人们就一直使用goto。那时候,如果程序员想创建一个循环,或者跳转到另一个例程,他们会键入goto,然后输入行号。几年后,出现了允许程序员使用字符串标签而不是行号的编译器。在当时,这样的能力一度被认为是炙手可热的技能。如今,越来越多的人把这种编程习惯产生的代码称为“意大利面条代码(spaghetticode)”。这些混乱的线程纠缠在一起,其他人完全无法读取,并且很可能会卡在自己的执行路径中。结构化程序设计之父EdsgerDijkstra曾针对这一现象发表过一篇文章。作为解决方案,您可以巧妙地使用break或return来明确说明代码执行到此处的后续行为。当然,有时我们可以在case语句中加上goto,这样会产生比层叠的“if-then-else”块结构更正确、更容易理解的列表。作为反例,您可能听说过Apple的SSL堆栈中的“gotofail”安全漏洞。如果我们能够小心地避免与case语句循环相关的棘手问题,并且只插入有效的绝对跳转,如break或return,那么整个问题就会容易处理得多。不良编程习惯5:未声明的类型有经验的程序员都知道,只有为每个变量的数据类型添加明确的声明,才能写出更好、更少错误的代码。只有我们提前完善了类型声明,编译器在执行程序代码时才不会遇到一些“愚蠢”的错误。养成这种编程习惯可能会很痛苦,但它肯定会让你受益。当然,随着技术的发展,许多现代编译器已经足够聪明,可以通过查看代码的上下文来推断变量是string、int还是其他类型。如果编译器真的不能推断出正确的类型,它会抛出一个适当的错误。错误的编程习惯6:Yo-yo代码“Yo-yo代码”是指将存储为字符串的值解析为整数,然后再转换回字符串。显然,这是一种非常低效的方式。它还会消耗大量CPU资源。因此,有经验的编码人员会通过合理的程序结构大大减少转换所需的工作量,从而提高代码的运行效率。这些天我们经常听到业内人士谈论偿还“技术债务”。这里可以理解为:程序员重写所有现有代码,清除yo-yo代码,最大限度地减少数值类型转换的成本和时间。不良编程习惯7:编写自己的数据结构。一些初出茅庐的程序员往往喜欢自己写一些存储数据的代码。而这些数据结构难免存在他们没有仔细考虑的潜在漏洞。其实他们应该明白:作为一门成熟的编程语言,各种常用的数据结构都已经提前准备好了。此外,这些程序代码通常与语言捆绑在一起。经过多年的测试和检验,开发者可以放心大胆地免费使用。当然,有时为了标准化,现成的数据结构库迫使我们在存储之前重新配置输入数据。因此,我们可以适当调整线程锁等功能的代码层级,去掉数据格式化等不必要的代码,让整体结构更加简洁。不良编程习惯8:老式循环很久以前,C语言的创造者希望将所有抽象的可能性封装到一个简单的结构中,这导致每次调用都需要循环操作,并且需要在完成时得到通知的操作。显然,这会降低程序的可读性。现在人们倾向于有一种更函数式的范式(paradigm),直接将函数式函数应用到列表上,将计算模板映射到一些数据上,而不是使用循环。当只有一个整洁的函数和一个数组时,使用没有循环的方法可以使程序更具可读性和简洁性。但是在需要一找到匹配就停止搜索的场景中,老式的循环仍然让程序保持简单高效。当然,地图函数更适合您对数据执行多项操作。例如:你想先取绝对值,然后对每个数取平方根。那么最快的方式就是:先映射第一个函数,再映射第二个,再循环两次数据。不良编程习惯九:跳出循环有些程序员在编程时喜欢在每次循环中使用一个变量,当变量为真(true)时,循环结束。虽然这是处理复杂循环的好方法,但它在某种程度上禁止我们在循环内使用return或break。编程坏习惯10:重定义运算符和函数对于一些初级程序员来说,由于缺乏知识和经验,他们可能会重新定义运算符和函数。例如,在Python2.7及更早版本中,您可以指定TRUE=FALSE。这将导致它会在您的代码中互换TRUE和FALSE的含义。同时,在C语言的预处理器以及其他一些语言中,还可以重新定义加号等运算符。当然,这样的重新定义并不是没有用的。面对庞大的现有库,可以暂时借用“逆向”功能简化大段代码,无需重写代码。综上所述,我们这里列举的所谓开发者的十大坏习惯,其实并不是一成不变的。关键是你能不能在合适的场景下使用合适的编程方式。原标题:我们暗恋的10个编程坏习惯,作者:PeterWayner
