代码整洁之路

序言

各位程序猿/媛们,还记得你刚入行时写下的那些代码吗?是不是像一堆乱麻,连自己都看不懂?是不是像我一样,曾经天真地以为,只要代码能运行,就万事大吉?

哈哈,别担心,我们都经历过那个阶段。写代码就像学武功,一开始都是乱打一气,只有经过不断的练习和领悟,才能慢慢掌握其中的奥妙。

那么推荐大家可以看看文章末尾推荐的几本书籍.这些书籍就是指引我们从无名小辈到扫地僧的武功秘籍。

代码

命名:代码的"名片"

还记得那个名为 d 的变量吗?它就像一个没有名片的人,你永远不知道它是谁,它要做什么。这样的代码,就像一个江湖黑话满天飞的武林,让人摸不着头脑。

好的命名,就像一张清晰的名片,能让人一眼就明白它的身份和职责。比如,elapsedTimeInDays 比 d 好懂多了吧?这就好比武林中人,行走江湖,总得有个响亮的名号,让人一听就知道你是谁,你擅长什么。

所以,请记住以下秘诀:

  • 抛弃那些毫无意义的字母,用完整的单词或短语来命名。
  • 避免误导。 别用 accountList 来指代一组账号,除非它真的是 List 类型。
  • 做有意义的区分。 a1、a2、aN 这种命名方式简直是灾难,请用 source 和 destination 来代替吧!

好的命名是代码整洁的第一步,也是最重要的一步。它能让你的代码像优美的散文一样,清晰易懂,令人愉悦。

函数:代码的"士兵"

还记得那个长达几千行的函数吗?它就像一个臃肿的胖子,行动迟缓,效率低下。这样的代码,就像一支乌合之众,毫无纪律可言,战斗力自然低下。

好的函数,应该像训练有素的士兵,短小精悍,各司其职。每个函数只做一件事,就像每个士兵只负责一个任务一样,这样才能保证整个队伍的效率和战斗力。

所以,请记住以下秘诀:

  • 函数要短,越短越好! 20 行封顶, 10 行更佳。(根据实际情况来)
  • 每个函数只做一件事。 别让你的函数像个杂耍演员,一会儿变个戏法,一会儿又变个戏法。
  • 每个函数一个抽象层级。 别把高层逻辑和底层细节混在一起,这会让你的代码像迷宫一样难懂。

好的函数是代码整洁的基石。它能让你的代码像积木一样,易于组合,易于维护。

示例

csharp 复制代码
// 糟糕的函数
public void calculateAndPrintReport() {
  // 计算数据
  // 格式化数据
  // 打印报表
}
​
// 好的函数
public void calculateReport() {
  // 计算数据
}
​
public void printReport() {
  // 格式化数据
  // 打印报表
}

注释:代码的"点缀"

还记得那些不知所云的注释吗?它们就像一堆垃圾,只会让代码更难懂。这样的代码,就像一个脸上涂满油彩的小丑,让人眼花缭乱,却不知其意。

示例

css 复制代码
i++; // 将 i 加 1

好的注释,应该像画龙点睛,起到解释和说明的作用,而不是画蛇添足。它应该简洁明了,直击要害,让人一看就懂。

所以,请记住以下秘诀:

  • 注释不能美化糟糕的代码。 如果代码很烂,最好的办法是重写,而不是加注释。
  • 用代码来阐述。 很多时候,你都可以用代码来表达你的意图,而不需要注释。
  • 写好注释。 如果非要写注释,请确保它清晰、准确、简洁。

好的注释是代码整洁的点缀。它能让你的代码锦上添花,但绝不能喧宾夺主。

示例

arduino 复制代码
// 解释算法的注释
// 使用快速排序算法对数组进行排序
public void sort(int[] array) {
  // ...
}

格式:代码的"颜值"

还记得那些缩进混乱、毫无章法的代码吗?它们就像一堆杂草,让人头晕眼花。这样的代码,就像一个衣衫褴褛的乞丐,毫无美感可言。

好的格式,就像代码的"颜值",能让你的代码赏心悦目,易于阅读。它就像一个穿着得体的绅士,让人一看就心生好感。

所以,请记住以下秘诀:

  • 保持代码行短小。 别让你的代码像一条长蛇,让人看不到尽头。
  • 使用空格和缩进来区分不同的代码块,让代码结构清晰可见。
  • 团队要有一致的格式规范,别让你的代码像一个拼凑的怪物。

好的格式是代码整洁的门面。它能让你的代码更专业,更易于维护。

示例

scss 复制代码
// 糟糕的格式
if (condition) {
doSomething();
} else
{
doSomethingElse();
}
​
// 好的格式
if (condition) {
  doSomething();
} else {
  doSomethingElse();
}

对象和数据结构:代码的"骨架"

对象和数据结构,就像代码中的"骨架",支撑着代码的整体结构。它们就像武功中的内功和招式,相辅相成,缺一不可。

对象,就像一个训练有素的特工,身怀绝技,却又深藏不露。它把数据隐藏在幕后,只向外界展示它能做什么,而不是它是什么。

数据结构,就像一个透明的玻璃箱,里面装满了各种数据,一目了然。它没有隐藏,也没有秘密,所有数据都直接暴露在外。

那么,什么时候该用对象,什么时候该用数据结构呢?

  • 当你需要添加新数据类型,而不是新函数时,对象是你的好帮手。
  • 当你需要添加新函数,而不是新数据类型时,数据结构是你的好选择。

记住,对象和数据结构各有优劣,选择合适的工具,才能写出整洁的代码。

示例

  • 当你需要存储和操作一组数据,并且需要频繁地添加或删除数据时,ArrayList 是一个好的选择。
  • 当你需要存储和操作一组数据,并且需要快速地查找数据时,HashMap 是一个好的选择。
  • 当你需要定义一个抽象的概念,并提供一些操作数据的函数时,对象是你的好帮手。

错误处理:代码的"消防员"

错误处理,就像代码中的"消防员",负责在代码出现问题时及时扑灭火灾。它就像武功中的防御招式,能够在关键时刻化解危机。

但是,如果消防员到处乱跑,只会让火势蔓延得更快。同样,如果错误处理代码写得不好,只会让代码更加混乱,难以维护。

所以,请记住以下秘诀:

  • 使用异常来处理错误,而不是返回错误码。 这能让你的代码更整洁,逻辑更清晰。
  • 先写 try-catch-finally 语句,再写正常逻辑。 这能帮你定义代码的行为边界,让代码更易于维护。
  • 避免返回 null 值。 这只会给调用者添乱,增加代码的复杂度。

好的错误处理应该像隐形的防护网,在代码出现问题时及时保护,而不是像个碍手碍脚的家伙,到处添乱。

边界:代码的"国境线"

边界,就像代码中的"国境线",将你的代码与外部世界隔离开来。它就像武功中的门派之别,划清了界限,避免了冲突和混乱。

如何守好这道"国境线",是写出整洁代码的关键。

所以,请记住以下秘诀:

  • 封装第三方代码。 不要让你的代码对第三方代码了如指掌,这会增加代码的耦合度。
  • 编写学习性测试。 通过编写测试来学习和理解第三方代码,这能让你更快、更准确地使用它。
  • 预测未来。 当你需要使用尚未存在的代码时,先定义你想要的接口,这能让你不受制于人。

好的边界应该像一道坚固的城墙,保护你的代码免受外部世界的侵害,同时又能方便地与外界沟通。

单元测试:代码的"侦察兵"

单元测试,就像代码中的"侦察兵",负责在代码中寻找 bug 和缺陷。它就像武功中的练功桩,帮助你不断提升代码的质量。

但是,如果侦察兵漫无目的地乱跑,只会浪费时间和精力。同样,如果单元测试写得不好,不仅不能保证代码质量,反而会成为代码维护的负担。

所以,请记住以下秘诀:

  • 遵循 TDD 三定律,先写测试,再写代码。
  • 保持测试整洁。 测试代码和生产代码一样重要,都需要精心设计和维护。
  • 每个测试只测试一个概念。 不要让你的测试像个贪婪的胖子,什么都想测。

好的单元测试应该像一把锋利的匕首,直击代码的要害,快速、准确地找到问题。

类:代码的"建筑师"

类,就像代码中的"建筑师",负责构建代码的整体结构。它就像武功中的心法,决定了你的代码能走多远。

一个好的建筑师,应该懂得如何设计出结构合理、功能清晰的建筑。同样,一个好的程序员,应该懂得如何设计出结构清晰、易于维护的类。

所以,请记住以下秘诀:

  • 类应该短小。 不要让你的类像个巨无霸,什么功能都往里塞。
  • 每个类只负责一件事。 不要让你的类像个多面手,什么都会,却什么都不精。
  • 保持类的内聚性。 类中的方法和变量应该紧密相关,共同完成一个目标。

好的类应该像一个精密的仪器,每个部件都各司其职,共同协作,完成复杂的任务。

代码整洁之道:持续精进

除了上面提到的内容,我还想补充以下几点:

  • 代码整洁是一种态度。 它不仅仅是技术问题,更是一种对代码的尊重和对专业的追求。
  • 代码整洁需要团队合作。 一个人写出整洁的代码并不难,难的是整个团队都保持一致的代码风格和质量标准。
  • 代码整洁需要持续学习。 随着技术的发展和项目的演进,代码整洁的标准也会不断变化,我们需要不断学习新的知识和方法,才能写出更好的代码。

我个人的建议是,不要把代码整洁看成是一种负担,而应该把它看成是一种投资。整洁的代码可以提高开发效率,降低维护成本,让你的代码更易于理解和扩展。

最后,我想说,代码整洁之道,没有终点,只有不断精进。让我们一起努力,写出更整洁、更优雅的代码吧!

开发

作为一名开发者,我深知开发不仅仅是敲代码,更是一项需要沟通、协作和不断改进的系统工程。以下是我在阅读过程中总结的一些经验:

持续沟通

正如书中所说:"开发者必须在许多层面上进行交流" ,与团队成员、用户和其他利益相关者的有效沟通是项目成功的关键。

  • 与用户沟通: 了解用户的需求和期望,并确保开发的软件能够满足他们的需求。例如,在开发一个新的功能之前,可以通过用户访谈、问卷调查等方式收集用户的反馈意见。
  • 与团队成员沟通: 保持项目进度和代码质量的一致性。例如,可以通过定期召开团队会议、使用代码审查工具等方式进行沟通。

及时修复漏洞

代码中的漏洞就像房间里的"破窗户",如果不及时修复,就会让房间变得越来越脏乱。因此,我们应该养成及时修复漏洞的习惯,避免问题越积越多。

  • 使用代码分析工具: 帮助我们发现代码中的潜在问题。例如,可以使用静态代码分析工具来检查代码的语法错误、代码风格等问题。
  • 编写单元测试: 确保代码的正确性。例如,可以使用单元测试框架来编写测试用例,并定期运行测试。

持续重构代码

代码重构就像整理房间,可以让我们更容易地理解和维护代码。我们应该定期对代码进行重构,消除重复、冗余和难以理解的代码,让代码更简洁、更高效。

  • 使用重构工具: 帮助我们进行代码重构。例如,可以使用 IDE 中的重构功能来进行代码重构。
  • 遵循重构原则: 确保代码重构不会改变代码的行为。例如,可以使用测试驱动开发的方式来进行代码重构。

使用合适的工具

工欲善其事,必先利其器。选择合适的工具可以让我们事半功倍。

  • 版本控制工具: 例如 Git,可以帮助我们管理代码版本,方便团队协作。
  • 代码分析工具: 例如 SonarQube,可以帮助我们发现代码中的潜在问题,提高代码质量。
  • 构建工具: 例如 Maven,可以帮助我们自动化构建过程,提高开发效率。

保持学习的态度

软件开发是一个快速发展的领域,新的技术和工具层出不穷。作为开发者,我们需要保持学习的态度,不断学习新的知识和技能,才能跟上时代的步伐。

  • 阅读书籍和文章: 了解最新的技术和趋势。
  • 参加培训和会议: 学习新的技能和知识。
  • 参与开源项目: 锻炼自己的开发技能,并与其他开发者交流学习。

注重团队合作

软件开发是一个团队合作的过程,我们需要与团队成员相互协作,才能完成项目目标。

  • 互相帮助: 团队成员之间应该互相帮助,共同解决问题。
  • 代码审查: 通过代码审查可以发现代码中的问题,并提高代码质量。
  • 结对编程: 通过结对编程可以提高代码质量,并促进团队成员之间的沟通。

关注用户体验

最终用户是软件的使用者,他们的体验决定了软件的成败。

  • 用户研究: 了解用户的需求和期望。
  • 用户界面设计: 设计易于使用和美观的用户界面。
  • 用户体验测试: 测试用户对软件的体验,并进行改进。

拥抱变化

软件开发是一个充满变化的过程,需求可能会变更,技术可能会更新。作为开发者,我们需要拥抱变化,灵活应对各种挑战。

  • 敏捷开发: 采用敏捷开发方法可以帮助我们快速响应变化。
  • 持续集成和持续交付: 通过持续集成和持续交付可以帮助我们更快地将软件交付给用户。

追求卓越

作为注重实效的开发者,我们应该追求卓越,不断提升代码质量和开发效率,为用户提供更好的软件产品和服务。

  • 编写高质量的代码: 代码应该是可读的、可维护的、可测试的。
  • 提高开发效率: 使用合适的工具和方法来提高开发效率。
  • 持续改进: 不断寻找改进代码和开发过程的方法。

享受开发的乐趣

软件开发是一项充满挑战和乐趣的工作。我们应该享受开发的过程,从中获得成就感和满足感。

  • 选择自己喜欢的项目: 参与自己感兴趣的项目可以让我们更有动力。
  • 与团队成员一起工作: 与团队成员一起工作可以让我们更快乐。
  • 挑战自我: 不断挑战自我可以让我们获得更大的成就感。

总结

注重实效的开发不仅仅是编写代码,更是一项需要沟通、协作和不断改进的系统工程。通过有效的沟通、及时的修复漏洞、持续的代码重构、使用合适的工具、保持学习的态度、注重团队合作、关注用户体验、拥抱变化、追求卓越和享受开发的乐趣,我们可以成为更加注重实效的开发者,为用户提供更好的软件产品和服务。

让我们一起努力,用代码改变世界!(世界太大,不如从自己开始)

参考书籍

1.《代码整洁之道》

2.《程序员修炼之道:从小工到专家》

3.《重构:改善既有代码的设计》

相关推荐
弗拉唐43 分钟前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi771 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
2401_857610032 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀2 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20202 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
凌冰_2 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举