代码整洁(1):整洁代码、有意义的命名
《代码整洁之道》Clean Code A Handbook of Agile Software Craftsmanship 读书笔记
什么是整洁代码
有多少程序员,就有多少定义。每个人理解的都不一样,我理解的整洁代码:
- 可读性高
- 良好的命名等,代码表达力强
- 尽量少的依赖关系
- 使代码更便于维护
- 目的明确
- 直接体现作者的意图。每个函数,每个类和每个模块都全神贯注于一事,完全不受四周细节的干扰和污染
- 没有重复的代码
- 如果同一段代码反复出现,就表示某种想法未在代码中得到良好的体现。
- 高效
- 每段代码都有它必须存在的理由,没有多余的逻辑
有意义的命名
- 名副其实
- 变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算名副其实。
- 避免误导
- 避免使用与本意相悖的词。
- 做有意义的区分
- 同一系列的不能单纯的使用数字来命名。命名的名称必须相异,提供向导作者意图的线索。尽量不适用意义含混的废话,Info和Data就像a、an和the一样。
- 使用读得出来的名称
- 使用可搜索的名称
- 名称长短应与其作用域大小相对应。若变量或常量可能在代码中多处使用,则应赋其便于搜索的名称。
- 避免使用编码
- 匈牙利语法标记法(话说这种命名带数据类型的现在没啥用啊,反而增加负担(⊙﹏⊙)b)
- 减少没必要的前缀
- 接口和实现(在书中并不建议使用前导字母 I 来修饰接口,不过本人更倾向于对接口使用前导字母来进行修饰!)
- 避免思维映射
- 不应当让读者在脑中把你的名称翻译为他们熟知的名称。
- 类名
- 类名和对象名应该是名词或名词短语。
- 方法名
- 方法名应当是动词或动词短语。
- 别扮可爱
- 参考“名副其实”,就是不要用一些奇葩的名字。
- 每个概念对应一个词
- 给每个抽象概念选一个词,并且一以贯之。
- 别用双关语
- 避免将同一单词用于不同目的。
- 使用解决方案领域名称
- 只有程序员才会读你的代码,所以尽管使用那些极端及科学术语、算法名、模式名、数学术语吧。(貌似自己知道的真不多)
- 使用源自所涉问题领域的名称
- 如果不能用程序员熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称。
- 添加有意义的语境
- 如果名称不能完全自我说明,就需要用有良好命名的类、函数或名称空间来放置名称,给读者提供语境。
语境不明确的变量:
private function printGuessStatistice($candidate, $count)
{
$number = '';
$verb = '';
$pluralModifier = '';
if ($count == 0) {
$number = 'bn';
$verb = 'dong';
$pluralModifier = 'bndong';
} elseif ($count == 1) {
$number = 'DONG';
$verb = 'BN';
$pluralModifier = 'DONGBN';
} else {
$number = strval($count);
$verb = 'bndong';
$pluralModifier = '';
}
$guessMessage = sprintf(
'String %s %s %s%s', $verb, $number, $candidate, $pluralModifier
);
echo $guessMessage;
}
这里我们分解这个函数,新建一个类GuessStatisticsMessage,把三个变量做成该类的成员字段。增强语境也让算法能够通过分解为更小的函数而变得更为干净利落。
class GuessStatisticsMessage
{
private $number;
private $verb;
private $pluralModifier;
public function make($candidate, $count)
{
$this->createPluralDependentMessageParts($count);
return sprintf(
'String %s %s %s%s', $this->verb, $this->number, $candidate, $this->pluralModifier
);
}
private function createPluralDependentMessageParts($count)
{
if ($count == 0) {
$this->thereAreNoLettres();
} elseif ($count == 1) {
$this->thereIsOneLetter();
} else {
$this->thereAreManyLetters($count);
}
}
private function thereAreManyLetters($count)
{
$this->number = strval($count);
$this->verb = 'bndong';
$this->pluralModifier = '';
}
private function thereIsOneLetter()
{
$this->number = 'DONG';
$this->verb = 'BN';
$this->pluralModifier = 'DONGBN';
}
private function thereAreNoLettres()
{
$this->number = 'bn';
$this->verb = 'dong';
$this->pluralModifier = 'bndong';
}
}
- 不要添加没用的语境
- 只要短名称足够清楚,就要比长名称好。别给名称添加不必要的语境。(个人理解就是尽量精简名称里的字母)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话