清洁代码
任何傻瓜都能写出计算机能理解的代码。优秀的程序员写出的代码,人类也能理解。——
马丁·福勒
编写简洁、易懂、易于维护的代码是每个开发人员都必须掌握的关键技能。
我所说的“整洁代码”是指:
- 团队内部应采用正确的变量名、函数名、类名,以及正确的缩进、空格、注释和统一的代码风格。
- 代码行数、类、函数等数量尽可能少。代码越少,意味着麻烦越少,bug越少,维护成本也越低。
- 代码中不得存在重复。软件中存在重复代码表明软件质量低下,且缺乏专业知识。
- 这似乎与我之前的观点相矛盾,但过度抽象也是不好的。如果你的抽象导致每次引入新功能时,你都必须在方法中添加更多条件和额外参数,那么这种抽象就是糟糕的/错误的,你应该遵循以下几点:
- 尽量找到一种方法,使得每次引入新功能时,你的抽象层都不会受到影响。
- 回到重复代码的时代。你没听错。重复代码永远比错误的抽象要好。
我不认为这是抽象概念的缺陷,而是由其他一些具体缺陷造成的。
a. Failure of people to understand data modeling, and the
difference between interface and implementation. "A new
requirement appears for which the current abstraction
is almost perfect. Just because the code is the same
doesn't mean it should use the same abstraction. The
data model is wrong, not the abstraction.
b. Failure of people to think of the entire system, when
making a change. The rookie mistake is to think that
adding one more conditional is always harmless, but, at
some point, you've got 3 tons of straw on that poor
camel's back. Adding just one more case may have been
the correct fix last week, but not this week.
- 不要使用魔法数字(魔法数字是指在代码中直接使用数字)。魔法数字不好,可读性差,难以维护,而且无法重用。
- 尽量避免硬编码。硬编码是不好的,它不可重用、不可测试,也不易于维护。
- 代码应该通过 100% 的测试用例(即使通过 99% 也说明你完蛋了)。
- 代码维护起来既简单又便宜。
- 成熟的程序员都知道,万物皆对象这种想法是错误的。有时,你确实需要一些简单的数据结构和过程来完成任务。因此,你必须仔细思考如何实现,同时也要考虑未来的发展,确保哪些功能易于更新。
务必为你的代码编写简洁明了的文档(类、函数、属性等)。
编写简洁代码的技巧
- 变量名、函数名或类名应该具有描述性。如果需要注释来解释名称的功能,那就是糟糕的命名规范。
let s; // number of seconds ---> Bad naming convention
Good naming convention:
let numberOfSeconds, customerName, employeeName, mailMessage, mailFolder
- 命名时请勿包含任何冗余信息/干扰词。一些干扰词包括:
- 数据
- 目的
- 信息
- 信息
- 多变的
- 细绳
Bad naming convention:
userInfo, userData, userVariable, userObject, accountInformation, employeeString etc.
Good naming convention:
user, employee, account etc.
- 命名功能相似的变量时,请保持一致。例如,对于存储从 API 调用或数据库获取的数据的变量,请仅使用以下三个词之一:get、retrieve 或 fetch。不要使用多个相同的词,因为它们执行的是相同的任务。
Say you decide to follow get convention:
getUser, getName, getFile, getAccount etc. ==> Good convention
getUser, retrieveAccount, fetchName ===> Bad convention
- 不要使用魔法数字(魔法数字是指在代码中直接使用数字)。
Bad convention:
if(age>=18) "eligible for voting"
Good Convention:
MINIMUM_AGE_FOR_VOTING=18;
if(age>=MINIMUM_AGE_FOR_VOTING) "eligible for voting"
-
避免在注释中留下代码,因为这会让其他开发者害怕删除它们,因为他们不知道这些代码是用于注释还是留作以后使用。
-
始终遵循您所使用编程语言定义的编码风格。以下是 TypeScript 中的一些约定:
- 变量名应采用驼峰式命名法。
- 函数名应采用驼峰式命名法。
- 类名应采用帕斯卡命名法。
-
尽量遵循DRY(不要重复自己)原则。
-
函数名应该是动词。
-
类名和变量名都应该是名词。
-
建议使用Prettier等代码格式化工具,以便更好地组织代码。
-
人们经常问我,变量名、函数名或类名的最大长度应该是多少。我的回答是:
如果存在更短但同样能描述变量、类名特征的命名方式,那么你当前的变量名、函数名或类名就太长了。
结论
编写简洁代码的技巧来自于在软件开发中反复实践。这是编写软件代码时至少应该遵循的原则。
文章来源:https://dev.to/tastaslim/clean-code-1ce
