命名在编程中的重要性

2024-03-26  本文已影响0人  涅槃快乐是金

通过为函数、变量和其他构造找到好的名称,我们才能真正认识到我们正在解决的问题的本质。清晰度的获得不仅仅是好的名称,还有更清晰的代码和改进的架构。

编写清晰代码,正确命名事物。听起来很简单,但实际上并不是!

例子1

// 给出一个人的名和姓,返回所有匹配人员的人口统计数据。
async function demo (a, b) {
  const c = await users(a, b);
  return [
    avg(c.map(a => a.info[0])),
    median(c.map(a => a.info[1]))
  ];
}

这段代码有什么问题?

让我们修复它:

async function fetchDemographicStatsForFirstAndLastName (
  firstName, lastName
) {
  const users = await fetchUsersByFirstAndLastName(
    firstName, lastName
  );
  return {
    averageAge: avg(users.map(u => u.stats.age)),
    medianSalary: median(users.map(u => u.stats.salary))
  };
}

我们做了什么?

例子2

// 找到一个空闲的机器并使用它,或者根据需要创建一个新的机器。
// 然后在该机器上,使用给定的 Docker 镜像和设置命令设置新的工作者。
// 最后,在该工作者上开始执行一个作业并返回其 id。
async function getJobId (
  machineType, machineRegion,
  workerDockerImage, workerSetupCmd,
  jobDescription
) {
  ...
}

在这个例子中,我们忽略了具体实现细节,只关注名称和参数的正确性。

这段代码有什么问题呢?

async function procureFreeMachineAndSetUpTheDockerWorkerThenStartExecutingTheJob (
  machineType, machineRegion,
  workerDockerImage, workerSetupCmd,
  jobDescription
) {
  ...
}

哦,那是一个又长又复杂的名字。但事实是,如果不失去关于函数做什么以及我们可以从中期待什么的宝贵信息,我们实际上无法将其缩短。因此,我们陷入了困境,我们找不到更好的名称!现在怎么办?

问题在于,如果背后没有干净的代码,你就无法给出一个好的名字。因此,一个糟糕的名称不仅仅是一个命名错误,而且通常也是设计失败的指标。代码如此问题严重,以至于你甚至不知道该如何命名它→没有直接的名称可给它,因为它不是一个直接的代码!

糟糕的名称隐藏了糟糕的代码

在我们的例子中,问题在于这个函数试图一次做太多事情。一个长的名称和许多参数是这一点的指标,尽管在某些情况下这些都是可以接受的。更强的指标是名称中使用的单词“and”“then”,以及可以通过前缀(machine、worker)对参数名称进行分组。

解决方案是通过将函数拆分为多个较小的函数来清理代码:

async function procureFreeMachine (type, region) { ... }
async function setUpDockerWorker (machineId, dockerImage, setupCmd) { ... }
async function startExecutingJob (workerId, jobDescription) { ... }

什么是好名字?

但让我们退一步 - 什么是糟糕的名称,什么是好的名称?这意味着什么,我们如何识别它们?

好的名称不会误导,不会省略,也不会假设。

一个好的名称应该让你对变量包含的内容或函数的功能有一个很好的了解。一个好的名称将告诉你所有你需要知道的内容,或者告诉你足够的内容以知道下一步该去哪里。它不会让你猜测或疑惑。它不会误导你。一个好的名称是明显的,并且是可以预期的。它是一致的。不要过于创造性。它不会假设阅读者不太可能拥有的上下文或知识。

此外,上下文至关重要:你无法在阅读名称的上下文之外评估名称。verifyOrganizationChainCredentials可能是一个糟糕的名称,也可能是一个好的名称。a可能是一个好的名称,也可能是一个糟糕的名称。这取决于故事、环境、代码正在解决的问题。名称讲述了一个故事,它们需要像一个故事一样配合。

著名糟糕命名的例子

如何想出一个好名字

最好的建议不是给一个名字,而是找到一个名字。你不应该像给宠物或孩子取名字那样,编造一个原始的名字;相反,你应该找出你所命名的事物的本质,基于它来给出名字。如果你不喜欢你发现的名字,那意味着你不喜欢你所命名的事物,你应该通过改进代码的设计来改变这个事物(就像我们在示例 #2 中所做的那样)。

你不应该像给你的宠物命名一样给你的变量命名,反之亦然

找到一个名字时要注意的事项

每次想出名字时的简单技巧

如果你在想出一个名字时遇到困难,可以按照以下步骤操作:

不要过于纠结于一开始就想出完美的名字 → 进行多次代码迭代是可以的,每次迭代都会随着你的代码和名字的改进而改进。

以命名为重点审查代码

一旦你开始思考命名,你就会看到它如何改变你的代码审查过程:重点从查看实现细节转移到首先查看名称。

当我进行代码审查时,我会有一个主要的想法:“这个名字清楚吗?”从这里开始,整个审查过程会演变成清洁的代码。

检查一个名称是解开其背后整个混乱的一个单一压力点。搜索糟糕的名称,你迟早会发现糟糕的代码,如果有的话。

命名通用规范

Codelf:变量命名神器?

这是一个由国人开发的网站,网上有很多人称其为变量命名神器, Guide 在实际使用了几天之后感觉没那么好用。小伙伴们可以自行体验一下,然后再给出自己的判断。

我选择了 Java 编程语言,然后搜索了“序列化”这个关键词,然后它就返回了很多关于序列化的命名。

并且,Codelf 还提供了 VS code 插件,看这个评价,看来大家还是很喜欢这款命名工具的。

上一篇 下一篇

猜你喜欢

热点阅读