在编程成为干净的代码忍者时,我们应该认识到比较常见的代码气味的集合。
您是否曾经在阅读代码时感觉到告诉您某些错误的感觉? 那种"看起来有些不好"的感觉,但是,您仍然无法确切地知道问题出在哪里吗?
这种怪异的感觉是,您从代码中得到的是正确的直觉。 这些是不良做法,通常称为代码气味。
能够发现气味并实现更清洁的解决方案将帮助您在编程生涯中取得重大进步,帮助您自学如何编写干净的代码。
临时字段
即使试图避免这种情况,也有一种常见的情况是我们有条件地设置一个类字段。 由于您希望使用类中的所有字段,因此这可能会使代码的清晰度降低。
好的解决方案是提取一个新类,以为此字段创建一个位置并移动相关功能。 另外,最好引入一个特殊情况,当变量无效时,该情况会创建另一个类。
庞大的类
当一个类开始增长并且包含太多字段时,重复的代码就在后面。 而且我们讨厌重复的代码! 因此,我们应注意使其尽可能小。
您可能会发现自己重构了一个无限类,因为它可以处理无关的操作,第一个解决方案是使用类提取来分离代码。
但是由于我们喜欢简单的解决方案,因此最快的解决方案可能是消除类本身内部的冗余。 例如,要这样做,您可以采用带有大量共享代码的长方法,然后将它们拆分为较小的方法,以便您可以根据需要进行组合,从而避免任何形式的重复。
循环
即使它们长期以来一直是编程的核心,并且仍然有用,但仍有许多替代方法可以帮助我们的代码更具描述性,并让我们对代码一见钟情。
使用.map或.filter之类的管道方法有助于立即了解结构的操作方式,从而减少了更强制性的代码所造成的抽象。
懒元素
有时我们实现一个新结构,目的是在以后重用它,或者使我们的代码更整洁和更具描述性,但是最后,我们意识到它是无用的,并且我们从未在代码库中使用过它。 牺牲这部分代码!
例如,我们可以对函数和类使用内联技术来实现此结果。
神秘的名字
根据菲尔·卡尔顿的说法:
在计算机科学中只有两件难事:缓存无效和命名。
我完全同意他的看法。 正确命名变量,函数和类可以大大提高代码的清洁度! 它可以确保描述性更强的代码,减少注释的使用,并使将来的开发人员在阅读代码时更加轻松!
请记住,一台机器可以理解0和1,我们的代码稍后会翻译成该语言。 但是,我们编写的代码是为人类编写的,因此请编写代码,就像向6岁的孩子解释代码一样。
全局数据
这是每个开发人员在编写代码时都应记住的事情,因为可以从任何地方访问(尤其是可变的)代码,如果修改后会产生意外的行为。
全局数据最常见的示例是全局变量。 我们可以使用的第一个防御机制是用函数封装变量,因为这至少提供了更好的方法来控制其访问并查看其修改位置。
但是,我建议您始终避免使用全局变量和一般的全局数据。 始终存在不同的方法来实施可行的解决方案
注释过多
我并不是说注释自己的代码很不好,但是如果您编写的程序具有良好的命名并遵循简洁的代码模式,则代码将是不言自明的,从而减少了文件的样板并提高了代码库的可维护性。
当您需要编写注释时,请首先尝试重构代码,以使任何注释都变得多余。 马丁·福勒。
长参数列表
您认为期望6-7个(或更多)参数的有序列表的函数不会引起混淆吗? 有这么长的列表更容易出现错误并降低可读性。
通常,我们可以通过引入参数对象来解决此问题。 这样做包括将适合在一起的一长串参数组合到一个新对象中,并将其作为唯一参数传递。 这具有很多好处,因为我们可以在函数调用之前定义参数对象,而属性顺序无关紧要。 这是我们在任何参数列表中都应始终考虑的问题。
另一个选择是将函数组合成一个类,但这通常在某些函数共享相同的参数值时使用,以便我们可以捕获它们。
重复的代码
代码复制是非常专业的代码库中存在的另一种常见反模式,我们应该尽力减少它,以保持代码干净,并避免在功能改变时在不同位置更改同一代码。
有多种情况可以帮助删除重复的代码,但是最常见的解决方案是创建一个新函数来封装该逻辑的解决方案,或者在代码不完全相同的情况下,可以重新排列代码,以使它们相似 所有项目都在一起以便于提取(Slide语句)。
冗长功能
在我看来,为人类编写代码是成为优秀程序员的黄金法则。 长函数是这种思维方式的较大敌人之一,因为长函数使我们的代码可读性降低。
函数需要描述它们的功能,并应专注于一个孤立的任务,以便我们在必要时可以重用它们。 通常,随着功能的变长,其复杂性也会随之增加,并且代码的可维护性也会降低。
在大多数情况下,解决此问题的方法是将一部分代码提取到新函数(提取函数)中,并在必要时重新使用。
总结
照顾好您的代码并努力理解如何进行改进,这使我一直热爱代码和编程。 希望您能分享我的看法,并希望您喜欢这篇文章。 我将大部分学习归功于Martin Fowler和他的Refactoring书,我认为这是必读的!