首页 > 其他分享 >《代码整洁之道 Clean Code》学习笔记 Part 1 - 命名、注释、格式

《代码整洁之道 Clean Code》学习笔记 Part 1 - 命名、注释、格式

时间:2023-08-20 22:11:40浏览次数:35  
标签:Code 函数 代码 注释 避免 Part Clean 命名 格式

前段时间在看《架构整洁之道》,里面提到了:构建一个好的软件系统,应该从写整洁代码做起。毕竟,如果建筑使用的砖头质量不佳,再好的架构也无法造就高质量的建筑。趁热打铁,翻出《代码整洁之道》再刷一遍。

《代码整洁之道 Clean Code》学习笔记 Part 1

衡量代码质量的唯一标准:WTF/min

第一章 整洁代码

糟糕代码的代价

  • 理解、维护成本高。每次修改影响到好几处代码

  • 每次修改都会产生意想不到的问题,导致惧怕、抵触改动

  • 初期进展“迅速”,后续生产力持续下降,趋向于零

  • 破窗理论:如果对糟糕的代码放任不管,就会使人们争相效仿,甚至变本加厉

  • 不要想着先写出糟糕的代码,然后改进。勒布朗法则:Later equals never

  • Dealine 不是写出糟糕代码的借口,赶上 dealine 的唯一方法是写出 Clean Code

什么是 Clean Code

  • 消除重复
  • 只做一件事
  • 提高表达力:代码本身能够清晰地表达意图,不需要注释。良好的命名是提高表达力的重要手段
  • 提早构建简单抽象(小规模抽象)
  • 代码意图直截了当,不隐藏设计意图,叫 bug 难以隐藏
  • 减少依赖关系,使之便于维护
  • 性能调至最优,避免诱导他人来乱优化
  • 几乎没有改进的余地。如果你企图改进他,总会回到原点

童子军军规

Make the camp cleaner than when you arrived.

每次提交代码时,代码都比 checkout 时更干净,那么代码就不会变坏:

  • 改好一个变量名
  • 拆分一个过长的函数
  • 消除一点点重复代码
  • 清理一个嵌套 if

总结

“消除重复,只做一件事,提高表达力,小规模抽象”概括了本书的全部内容。

第二章 命名

为什么需要好的命名

读代码和写代码的时间大于 10:1,好的名字让人更容易理解和修改代码,节省下来的时间远远大于起名字所花的时间。

  • 命名是一件很严肃的事情,是一个程序员的基本功
  • 如果发现给函数或者类起一个合适的名字很困难,要反思函数和类的设计是否合理、是否过于复杂,违反了单一职责原则

名副其实

  • 变量、函数或者类的名字应该可以回答:它为什么存在,做什么事,该怎么用。如果还需要注释来补充,就不算名副其实
  • 一个好的函数名只要看名字就知道干了什么事,而不需要跳转进去看实现,有助于保持在一个较高的抽象层级上快速理解代码

一些命名建议

  • 类名和对象名应该是名词或名词短语
  • 函数或方法名应该是动词或动词短语
  • 不要自己发明一些奇奇怪怪的缩写
  • 使用可搜索名称,变量名的长短应和作用域大小相对应
  • 通常单字母变量名不是好的选择,除非用作循环控制变量的 i、j、k(较小的作用域)
  • 统一术语:不要混用 start/begin,get/fetch/retrieve、controller/manager/mgr... 混用多种术语让人困惑,增加记忆负担
  • 避免歧义:如集合有一个 add 方法,可能是对两个集合进行求和,如果想向集合插入数据,再用 add 命名就不合适,应该用 insert 或 append
  • 避免误导:避免名字中的 l10O
  • 避免很长的名字中藏着细微的差别:XYZControllerForEfficientHandlingsOfStrings 和 XYZControllerForEfficientStorageOfStrings
  • 使用编程相关术语,如设计模式 Singleton、Facade、Visitor...
  • 使用特定领域/行业的术语
  • 添加有意义的语境:命名空间、类、函数都可以提供语境。如果没有这么做,可以添加前缀
  • 避免无意义的语境:例如开发一个名为 GasStationDeluxe 的应用,给其中每一个类都加上 GSD 前缀就是没有意义的

避免无意义的区分

  • 如果有三个类:Product、ProductInfo、ProductData,人们无法从名字中判断这三个类有什么区别,到底该用哪一个类。其中 Info、Data 就是毫无意义的区分

  • customer 和 customerInfo、account 和 accountData、message 和 theMessage,这些都是无意义的区分,即无法通过名字区分这两个变量有什么区别

例子

标签:Code,函数,代码,注释,避免,Part,Clean,命名,格式
From: https://www.cnblogs.com/tengzijian/p/17644637.html

相关文章

  • LeetCode 周赛上分之旅 #40 结合特征压缩的数位 DP 问题
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • 运动控制-CodeSys编程书籍
    网上流传的陆国君PDF书籍<<PLC综合开发利器-CodeSys基础编程及应用指南>>很不错,这本书网上有两个版本556页是新的版本,423页是老的版本,不过内容差异不大.423页是老的版本下载:url80.ctfile.com/f/25127180-539049426-f8f96c(访问密码:551685)......
  • Oracle table partition发展史
    ---Oraclepartition功能发展历程细节参考:https://www.oracle.com/docs/tech/partitioning-guide-2703320.pdf......
  • VScode调试时查看指针所指向的值
    如图,现有一个字符串filenames[10000]传入到了其它函数,在该函数内设置断点进行调试时该字符串仅显示了个地址(虽然后面跟着有值,但字符串过长难以观察),那么如何将其显示出来呢?解决方法: 在watch窗口添加表达式:(char(*)[想查看的位数])变量名,即(char(*)[10000])filenames 值正......
  • AtCoder 题目集2
    AtCoder题目集2终于迈入了一个新的阶段,接下来希望质量能高一点吧。现在我主要刷的是1600左右的题,毕竟实力太拉,只能按照”分上200“的策略。(我觉得类型标个“思维”貌似没啥意义,毕竟AT几乎全是思维啊...)编号(NO.)题目难度类型1ABC201E1694,medium思维,XOR......
  • LeetCode 417.太平洋大西洋水流问题
    1.题目:https://leetcode.cn/problems/pacific-atlantic-water-flow/description/有一个 m×n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。这个岛被分割成一个由若干方形单元格组成的网格。给......
  • LeetCode -- 第 359 场周赛
    本题我们只需要将所有首字母取出来,并与s比较即可。classSolution{public:boolisAcronym(vector<string>&words,strings){stringres;for(auto&it:words){res+=it[0];}returnres==s;}};  ......
  • vscode 工作区文件数目太多时,代码无法提示补全
    VScode工作区过大时Python插件失效,无法跳转-CSDN根据这篇文章的说法,是由于语言服务器要搜索源文件,文件数目太多时会消耗时间过多,此时表现为ctrl点击模块名/函数名无法跳转(都是白色的,不是彩色的)。打开vscode--输出--Python语言服务器可以看到详细的日志解决方法......
  • IDEA 刷题工具 leetcode editor
    突然有一天不好用了,然后抓取新的cookie后也登陆不上https://github.com/shuzijun/leetcode-editor/issues/402之前的IDEA版本太低了,不支持JCEF更新到最新的2023.2版本但是又有了新的问题,发现evalreset用不了了,会抛出异常最后选择升级到2020.2.4版本的IDEA,解......
  • 3.你所不知道的go语言控制语句——Leetcode习题69
    目录本篇前瞻Leetcode习题9题目描述代码编写控制结构顺序结构(Sequence)声明和赋值多返回值赋值运算符算术运算符位运算符逻辑运算分支结构if语句switch语句逻辑表达式fallthrough类型推断循环语句continuebreakgotoLeetcode习题69题目描述题目分析代码编写本篇小结下篇预告本篇......