如何编写好的代码注释:“为什么”,而不是“如何”

哈Ha!我提请您注意杰克·富兰克林(Jack Franklin)的文章“写好的评论:为什么而不是如何”的翻译。



图片



在编程环境中注释掉代码通常被认为是浪费时间或可以改进代码的信号。这是我在GitHub上找到的CONTRIBUTING.md文件的引文(并且有很多这样的示例):

应避免发表评论。如果没有注释就无法理解您的代码,请将其重写以说明自身。


我相信在大多数情况下,这样的建议将是不成功和不正确的。 我认为,这种方法源于大多数学习编程的人的学习经验。当我在大学学习计算机科学时(尽管可以在很多课程中找到建议(不一定是大学课程)),我非常记得第一学期的一位老师说过:

每行代码都应带有注释,以解释其功能。您在课程中的工作将根据此标准进行判断。


因此,假设您是刚开始这门课程的新鲜出炉的学生。你会怎样做?当然,请注释代码!



//      bar
const inputValue = process.ENV.bar

//     2
const newValue = inputValue * 2

//     square
const finalValue = square(newValue)

//         
const square = (x) => x * x


认为评论不好的人实际上是在考虑这样的评论。他们是绝对正确的!像上面这样的注释,回答“如何?”的问题,在编程中是完全没有用的。所有这些注释都没有向代码添加任何无法从代码本身理解的内容。



回答问题“为什么?”



上面评论的问题是它们解释了如何解释我们在代码中采取的步骤。这样的评论很少有帮助;代码本身更好地告诉您该怎么做。毕竟,代码行仅仅是告诉计算机如何完成任务的指令。



通常,不需要大量的注释,因为您可以编写简单的代码而没有使人难以理解的功能或细微差别。但是有时会出现无法编写基本且直观的代码的情况。也许这是您必须解决的错误。或者,您以某种系统的形式从过去的开发人员那里继承了幸福,该系统不允许您以自己的方式解决问题。或者,归根结底,根本没有简单的方法可以改善您的代码。



有一次我在加工公司工作。每天我们都会运行一个庞大的SQL查询,以选择要支付的付款。该查询已进行了优化,我们需要使其速度非常快,并且非常复杂,需要考虑许多边缘情况。我们非常努力地使它尽可能清晰。但是,此请求永远不可能是完全直观和易于理解的。它只是包含太多带有一堆条件和逻辑的代码,这些条件和逻辑只能在我们公司及其工作方式的背景下才能理解。



我想找到一个在这里显示的示例,因此我深入研究了React代码库以找到一些东西。您无需成为React开发人员就可以解决它。因此,这是我要强调的代码:



//  key     .    , 
//  key      (, <div {...props} key="Hi" />
//  <div key="Hi" {...props} /> ).     key,   ,
//      jsxDEV   , 
// <div {...props} key="Hi" />,       ,
//    key   . 
if (maybeKey !== undefined) {
  key = '' + maybeKey
}


这是GitHub上的链接)。



注意代码本身:



if (maybeKey !== undefined) {
  key = '' + maybeKey
}


弄清楚它的作用并不难。如果未指定maybeKey,则将字符串化的maybeKey值分配给key。注意:这是一个JavaScript小技巧,可以'' + maybeKey将mayryKey的内容转换为字符串。



但是这里的整个问题是关于为什么的。此代码的注释很棒。他指出了这个问题,给出了两个例子,并解释了从长远来看如何解决这个问题以及短期内我们正在做什么。



如果要查看我在编写的代码中留下的任何注释,请使用以下注释之一(TypeScript / Closure编译器)。这是我认为非常有价值的评论类型的一个很好的例子。



最后,任何代码都可以理解。毕竟,代码不过是告诉计算机如何进行操作的指令。代码可能会造成混淆,但不能说谎。如果时间足够,那么任何开发人员都可以逐步检查代码并了解它在做什么。有时很难理解为什么这么做。因此,请让您的同事(或您六个月后的未来自我)了解有关代码为什么执行以及执行代码的原因。会更好。



All Articles