一文教你如何写出优质代码

MasutaaDAO · · 1507 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## **优质代码是什么?** **优质代码**是指那些易于理解、易于维护、可读性强、结构清晰、没有冗余、运行效率高、可复用性强、稳定性好、可扩展性强的代码。 **这类代码不仅能够准确执行预期功能,同时也便于其他开发者理解和修改。** 这类代码通常会遵循一定的设计模式和编程规范,拥有清晰的逻辑结构和规范的代码格式,且注释适量且恰当。 ## **优质代码该具备什么条件?** ### **1、轻量级** **轻量级的代码主要是指代码的复杂性低,易于理解和维护**。 这一般通过减少代码的冗余、提高代码的可读性和可维护性等手段来实现。例如,避免使用过多的嵌套语句,尽可能地使用简单的数据结构和算法,避免使用复杂的编程语言特性等。 ### **2、低耦合(松耦合)** **耦合是指代码之间的依赖关系**。低耦合或者松耦合的代码是指代码之间的依赖关系尽可能地少,每一部分代码都可以独立地完成其功能。 这样可以使得代码更容易维护和修改,因为修改一部分代码不会影响到其他部分的代码。实现低耦合的方法主要有模块化设计、使用接口或者抽象类来隐藏实现细节等。 ### **3、易替换** **易替换的代码是指当需求变更或者出现更好的实现方法时,可以方便地替换掉原来的代码**。 这需要代码的设计有良好的扩展性和灵活性,例如,使用接口或者抽象类来定义功能,使用设计模式来组织代码等。 ### **4、易删除** **易删除的代码是指当某部分代码不再需要时,可以方便地删除掉,而不会影响到其他部分的代码**。 这也需要代码的设计有良好的模块化和低耦合性。此外,还需要有良好的测试覆盖,以确保删除代码后,不会引入新的错误。 ## **如何写出优质代码?** ### **一、制定并遵守编码规范** 编码规范是一套预先设定并约定好的编程风格和代码书写规则。 这本规则指南的内容囊括了变量、函数和类的命名方法,空格和缩进的使用,注释的编写方式,以及代码结构的组织等等。**其主要目的在于保障代码的一致性和易读性,以便他人能更便捷地阅读和理解代码**。 **举个例子,Python社区有一个非常著名的编码规范PEP 8**。PEP 8对Python代码的格式有一系列的规定,比如说,缩进应该使用4个空格,不要使用制表符;每行代码的长度不应超过79个字符;变量和函数的命名应该全部使用小写字母,并用下划线分隔单词等等。 ### **二、写注释** 众所周知,鱼的记忆只有7秒钟,而程序员对他们写出代码的功能的记忆只有三天。 如果编程过程中不加以注释,那么在代码完成的那一刻,唯有程序员和上帝清楚其真正功能。三天过后,恐怕只剩上帝明了这段代码的真正含义。 **代码注释说白了就是对代码功能和实现逻辑的解释性补充,主要用于增强代码的可读性和可维护性**。 它应用的场景十分明确,就是在编程过程中为代码加一个解释说明,方便日后回顾。 然而,注释的质量并不等同于其数量,只有简洁、精准的注释才是高品质代码的标志。**过度的注释如同背景噪音,反而会干扰代码理解**。因此,适当的注释策略应是仅对代码中的关键部分与复杂逻辑进行注解。 除了其他常规好处,注释还有助于快速查找和理解之前编写的代码,从而提高代码的复用性。 ### **三、使用有意义的命名** 命名和注释一样,都是程序员的大难题。 如果说注释考验的是程序员的总结能力,那么命名无疑是在考验程序员丰富的想象力和创造力。我周围有不少心血来潮就会起奇葩名的程序员朋友,想一出是一出。写的时候自我感觉良好,觉得这个名合适或者方便,等到阅读代码时傻了眼,这都什么跟什么,为什么意大利面应该拌24号混凝土。 **一个好的名字应该能准确地反映出其功能或用途**,而不是随意地使用像list1或func1这样指代不明,看了就懂,下秒就忘的名字。 如果想解决命名这个难题,最好建立自己的命名规则,不论是对内部变量或全局变量,都应让人们能够一目了然其变量含义。 ### **四、避免使用全局变量** 全局变量是在程序全局范围内定义的变量,它们可以在程序的任何处被访问和修改。看起来很便利对吧,但如果大量使用全局变量,编程的整个环境会变得复杂且混乱。 **首先,全局变量破坏了封装原则**。封装是面向对象编程的一个重要原则,它隐藏了对象的内部细节以保护外部环境。全局变量可以在任何地方被修改,这使得追踪和理解代码流程变得困难。这意味着你需要记住全局变量的状态,并理解在程序的哪个部分会改变它。 **其次,全局变量导致函数之间产生隐含的耦合性**。这意味着一个函数的行为可能依赖于另一个完全不相关的函数是否修改了全局变量。代码便变得难以理解和预测。 **最后,全局变量可能导致命名冲突**。如果你在不同的地方使用相同的全局变量名,你可能会意外地覆盖全局变量的值。 相比之下,使用局部变量和函数参数能使代码更加清晰和可维护。局部变量仅在函数内部存在,因此你不需要关心它们在其他地方如何被使用或修改。函数参数可以明确地指出函数的输入和输出,使得理解和测试函数变得容易。 因此,**尽管全局变量在某些情况下可能是必要的,但在大多数情况下,最好尽量避免使用全局变量**。如果你需要在多个函数之间共享数据,可以考虑使用函数参数,返回值,或者创建一个包含这些数据的类。这将使你的代码更加清晰,易于理解,更容易进行测试和调试。 ``` # 不好的实践 x = 10 def increment(): global x x += 1 # 好的实践 def increment(x): return x + 1 ``` ### **五、尽量减少代码的重复** 在编程中,避免代码重复是一个非常重要的原则,通常被称为**DRY原则**,即"Don't Repeat Yourself"。 这意味着你应避免写入重复或相似的代码块,而是找出重复模式并创建可复用的函数或类替代。 例如,创建一个计算平均值的函数calculate_average,无论何处需要计算平均值,都可以调用此函数,而非重复编写相同代码。 ``` def calculate_average(numbers): return sum(numbers) / len(numbers) ``` 遵守DRY原则有**三大好处**: * **提升代码可读性**:无重复代码让代码更易理解。 * **减少错误**:使用函数或类避免因修改重复代码而导致的错误。 * **提高生产力**:一次编写,多次使用,节省时间和精力。 ### **六、使用版本控制系统** 版本控制系统是一种记录文件或者项目的修改历史,以便将来查阅特定版本的系统。 其中,Git是最受欢迎的版本控制系统之一,可以帮助开发者跟踪和管理代码变化,支持多人协作。主要命令有`git commit`和`git checkout`。 `git commit`用于提交修改,并附加解释消息。 当你对代码进行了修改,并希望将这些修改成为新的“版本”时,就可以使用`git commit`命令。这个命令会将你的修改保存并附加一条你自行编写的消息,以便解释此次修改的内容。通过这种方式,你可以清晰地跟踪每个版本的变化,以及进行这些变化的原因。 `git checkout`用于查看或回滚到早期版本。 这个命令可以让你查看或回退到代码的早期版本。如果你发现最新的代码存在问题,或者只是想查看早期版本的样子,就可以使用这个命令。执行这个命令后,你的代码库将回到你选择的那个版本的状态。 使用版本控制系统来写代码有**三大好处**: **1、跟踪代码变化**:你可以清楚地看到每一次的修改,以及为什么要做这些修改。如果你发现代码有问题,你可以回滚到早期的版本,或者比较不同版本的差异,找出问题的来源。 **2、支持多人协作**:每个人可以在自己的分支上工作,然后将修改合并到主分支。这样,每个人都可以同时工作,而不会相互干扰。 **3、作为代码备份**:即使你的电脑出了问题或没保存,你也可以从版本控制系统中恢复你的代码。 ### **七、测试你的代码** 测试代码是编程的关键步骤,它能确保代码的功能、性能和安全性,保证及时发现错误。 例如,可以使用Python的unittest模块编写测试用例: ``` import unittest class TestFactorial(unittest.TestCase): def test_factorial(self): self.assertEqual(factorial(5), 120) ``` 测试代码有五大好处: **1、发现错误**:在代码部署前发现并修复错误,防止潜在问题。 **2、质量提升**:保证代码的功能性、可靠性和性能,提升整体质量。 **3、效率提升**:及时发现并解决问题,避免后期大改,提升开发效率。 **4、提供文档**:测试用例可作为代码使用示例,帮助理解和使用代码。 **5、重构促进**:有了测试,可以更自信地进行代码重构,因测试会捕获引入的错误。 ### **八、保持代码简洁** 编程的目标之一自然是写出清晰、简洁和可维护的代码。如何写出一份简洁的代码全看程序员们的手下功夫,这是需要练习和后期修改的。 例如,使用Python的列表推导式可以简化代码: ``` # 不简洁的代码 result = [] for i in range(10): if i % 2 == 0: result.append(i) # 简洁的代码 result = [i for i in range(10) if i % 2 == 0] ``` 在上面的例子中,我们可以看到,使用列表推导式的版本比使用传统循环的版本要简洁得多,也更易读。这是因为列表推导式将循环和条件判断合并到了一行代码中,使得代码的逻辑更加明显。 ### **九、代码审查** 代码审查,也被称为代码评审或源代码审查,是一种质量保证活动。 开发人员通过检查、阅读和理解他人代码,以发现和修复错误、优化代码设计、提高代码可读性和可维护性,同时用来分享知识。这个过程可以在不同环境下进行,例如在会议中或使用代码共享平台如GitHub。 举个例子,在GitHub上,开发者通过Pull Request(PR)进行代码审查,请求他人检查并合并更改。这个机制让团队成员能对新的或修改的代码提出问题、建议或修复。 **代码审查的好处**包括:发现和修复代码错误,提高软件质量和稳定性;优化代码设计,提高代码可读性和维护性;分享知识和最佳实践,提高团队效率。 此外,新员工可以通过代码审查更快地了解代码库和项目,同时,开发人员也可以通过审查他人代码来提升自己的技能。 ### **十、代码重构** 代码重构是优化代码的过程,其中包括分解、合并、简化等步骤,目的是想提高代码的质量、可读性、可维护性和可重用性。 程序员们常说“如果程序能跑,就别碰它”。这话有点自嘲的意味,因为有时候bug出现的地方和原因可能千奇百怪,也确实不知道怎么解决。 **可不管程序的下场就是——越到后面越收不了尾,最后可能造出个屎山代码来**。 好比GTA5这个游戏,在加载时居然有个if语句居然循环了19.8亿次,严重拖慢了游戏的加载速度,结果修了7年都没修好,生怕改了这串代码后其他程序跟着崩溃。 而且重构不应该等上个几个月再进行,而应该是实时的,持续的,写完了一个功能后最好就想着如何优化、重构它了。修改一篇800字的作文,最好的修改时间就是写完的那一刻。 ## **学习方法** ### **1、避免重复造轮子** 在IT行业中,"重复造轮子"这个词通常用来形容一种无谓的努力,即重新编写一些已经被别人编写过的代码或者功能。 **可如果已经有了一种解决问题的方法,那么就实在没有必要再去花费时间和精力去创建一个相同的解决方案,重复的劳作只会让人身心疲惫**。 人类文明之所以会进步,是因为我们踩在前人的肩膀往上爬,编程也是这个道理。 有些程序员会对这种借鉴的行为不屑一顾,觉得很low,真正的大佬就该自己从零开始做一切! 这样的想法很对,但问题是,咱们又不是大佬,只是普普通通的小码农,有捷径为什么不走?开源社区的意义不就是通过分享让所有人能轻松解决已经解决过的问题吗? ![1.png](https://static.golangjob.cn/230822/933409256789e2ef0a667bc5ce666f66.png) **举个例子**,假设每个人都得自己动手制造一辆汽车,那将会是多么的费时费力。我们需要从零开始研究如何制作轮胎、发动机、刹车系统等等。但实际上,我们完全可以直接买一辆已经生产出来的汽车,然后根据自己的需求进行一些定制。这样一来,我们就可以把时间和精力用在更重要的事情上,比如开着汽车去我们想去的地方。 **现在已经有许多开源的库和框架供我们使用,它们已经帮我们解决了许多普遍存在的问题**。我们只需花时间学习如何运用它们,而无需从零开始编写代码。这样,我们就能把更多的时间和精力集中在解决实际业务问题上,而不是纠结于底层技术问题的处理上。 **遵守“避免重复造轮子”这个概念,对我们的好处显而易见**。 **一来**,避免了重复劳作,提高了工作效率。**二来**,利用其他人已经测试过的代码,就可以避免掉一些常见的错误和bug。 简单来说,程序员应该尽可能地利用已有的资源,而不是浪费时间去重复别人已经做过的事情。 ### **2、多看官方文档及他人代码** 如果想要提升自己的代码质量,最好的办法还是去多看多学多练,因为很多东西是“纸上得来终觉浅,绝知此事要躬行”。 **官方文档和他人的优质开源代码,可以说是程序员最好的学习资源**。 官方文档是技术或软件开发者为大家提供的最全面、最权威的信息来源。它通常包含了你需要知道的一切,包括如何使用这项技术,技术背后的原理,以及常见问题的解答等等。 初学者对官方文档的第一印象可能是“难懂”,其实不是的。 官方文档一般会从基础的概念开始讲起,然后逐渐深入到更复杂的内容。这种结构有助于我们系统地理解和学习一项技术。此外,官方文档通常包含很多示例代码,我们既可以通过这些代码来理解概念,也可以把它们作为实践的基础。 通过阅读和实践官方文档,我们不仅可以学到如何使用技术,也可以理解到技术背后的设计思想,这对于我们理解和掌握技术是非常有帮助的。 ![2.png](https://static.golangjob.cn/230822/61e9726fde667bcc0429dc18b357427d.png) 阅读优秀的开源项目代码,是学习和理解如何有效地组织和构建代码的最佳渠道。 深入阅读他人的代码时,我们会得到一些书上不会告诉我们的知识,比如如何处理各种错误和异常等。书和教学视频教会我们理论知识,而这些实战中出来的代码会告诉我们在实际编程过程中可能会遇到的问题,会告诉我们解决这些问题的思路。 此外,多看看优秀案例有助于我们培养形成良好的编程风格。 ### **3、面向搜索引擎编程** 开源的价值在于它为开发者搭建了一个广大的平台,让他们能够共享代码,吸取他人的优秀经验,同时也能针对别人的代码进行修改和优化,以此来提升自己的编程水平。 这些前人趟过雷的经验教训或是精心制作的框架代码都放在网络上。很多时候,你所疑惑的问题或者想实现的功能已经在网上了,你不必苦思冥想或者去麻烦其他程序员,**只需要动动鼠标,你就可以得到答案**。 在这个过程中,搜索引擎就像一本大型的知识百科全书,它里面储存了丰富的编程知识和解决问题的方法,只需要输入关键词,就能找到相关的信息。 ![3.png](https://static.golangjob.cn/230822/543f874a9f41b85e757bd3383e40ddfc.png) 有些人可能认为,仅会用搜索引擎找资料而不自己动脑筋解决问题算什么好汉。 然而,实际情况是,如果一个普通的程序员能够熟练运用搜索引擎,那他就能立马解决目前面临的99%的问题。至于为什么是99%,那是自然是因为搜索引擎也不是万能的。 **有时候搜索引擎所提供的答案并不能完全解决你的问题,或者说,你需要花费大量的时间去筛选和理解这些信息**。 不过不管怎么说,利用搜索引擎编程的确有效提升效率和代码质量,搜索过程中还可参考他人优秀实践,以避免重复劳动。同时还能学习最新技术,保持技术领先,并能寻找编程问题的解决方案,增强解决问题能力。 Google、Stack Overflow和GitHub是开发者常用的三个搜索工具,可以解决开发过程中的大部分问题。 Google可以提供大量的编程知识和教程,Stack Overflow是一个专门为程序员提供问题解答的社区,GitHub则是一个开源代码托管平台,可以找到大量的优秀代码和项目。 ### **4、走出第一步** 哪怕写的是垃圾代码,你也得先写啊。不写就什么东西都没有了。 想写优质代码,首先要敢于写垃圾代码。尽可能地把所有需求的代码都写出来,哪怕它们看起来很混乱。 就好比写作,脑中的想法再完美,如何想着下笔如有神,你都得先把想法写下来,无论是何种贫瘠的语言或是不出色的文笔,都得先把这些写出来,然后才能够修改它。 你要接受需求是不断变化的,得先把能搞定需求的代码写出来,后期再重构。 **那怎么把垃圾代码修改成优质代码呢?** 这里有一个原则大家可以看一下: #### **开放-封闭原则(OCP)** 开放-封闭原则(OCP)是面向对象设计五个基本原则之一,它的核心思想是软件实体(类、模块、函数等等)应当对扩展开放,对修改封闭。 **换句话说,当软件需要变化时,应该通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现**。 **"对扩展开放"** 意味着我们应该设计出可以容纳新功能的系统,这就要求我们在设计系统时需要有前瞻性,考虑到可能的未来需求和变化。 **"对修改封闭"** 则意味着一旦系统完成,我们应该尽量避免修改已有的代码。因为对已有代码的修改会带来风险,可能会引入新的错误。如果我们的系统设计得足够好,那么当新的需求来临时,我们只需要添加新的代码,而不是修改旧的代码。 为了达到这个目标,我们需要在设计时尽可能使各个模块之间的依赖关系降至最低,使得一个模块的改动不会牵连其他模块。**同时**,我们也需要尽可能地使用抽象和封装,通过定义接口或者抽象类来隐藏具体实现,这样当具体实现变化时,依赖于它的代码就不需要改动。 ## **关于Masutaa** Masutaa是个互联网从业者自由协作交流平台,链接行业内TOP10%人才!目前平台上已经有将近400名互联网尖端人才,其中近70%的从业者从业年限超3年。 **在这个平台上,你有机会获得远程项目,也可实现地理套利,成为数字游民!**

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1507 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传