基本上我总是尽量避免评论。看了很多Bob大叔的视频,他想表达的东西,有很多我是赞同的
他曾经提到,理想情况下,每当我们倾向于使用注释来提供更多信息,说明为什么我们在某个函数中以我们的方式做事时,这就是我们可能应该反思代码质量的地方其实已经写好了
我当然知道,在更大的系统中,某些东西的背景,如果没有任何注释,仅靠代码本身是很难解释清楚的。但我仍然觉得也许我还不够了解,某些事情确实可以用实际代码本身来表达(假设我使用正确的命名约定等)
这是一个具体的例子:
我正在开发一个 Telegram Bot,它需要从通道内的消息中检索数据,然后转发到系统其余部分的其他组件。由于该项目的限制,我只能通过使用 Selenium Webdriver 来做到这一点。目前我真的很难选择正确的命名约定。
我发现目前,我可以通过可点击的 WebElement 对象检查特定 Telegram Channel 是否有 urnead 消息。如果没有可用的未读消息,它有一个包含 3 行的字符串成员变量“text”。但是,如果有未读消息可用,则成员变量“text”将有 4 行。本例中的附加行包含未读消息的数量。
所以我最不想做的就是写一个这样的函数:
def isUnreadMessageAvailable(self):
if len(self.__buttonElement.text.splitlines()) <= 3:
return False
return True
首先我当然不喜欢的是那里的硬编码“3”。我可能需要在其他 python 文件中的其他几个地方使用那个确切的阈值。另外这个“3”可能随时改变,所以当适应新的阈值时,我显然不想在 100 个不同的地方编辑它。
相反,我宁愿使用这样的东西:
def isUnreadMessageAvailable(self):
if len(self.__buttonElement.text.splitlines()) <= Constants.AMOUNT_OF_LINES_IF_MESSAGES_READ:
return False
return True
如您所见,我将“3”替换为的变量名称非常长。我的意思是它包含六个词。最近我觉得我在为变量、文件和函数起好名字方面比写逻辑让我的程序做我想做的事更费劲。
对于这个冗长的问题,我深表歉意,但在这种情况下,如果不使用包含较少单词的变量,我无法提供一种方法来为代码提供可读性。 感谢您对您的经历提出任何意见。也许你的一些意见/解决方案可以在我以后遇到类似的事情时帮助我。
您的代码适用于三个受众:
编写您的代码,以便您未来的自己能够理解它。
您向我们展示的方法包含一些假设。你的三行、两行、七行或未来的任何一行都有一些特别之处。
方法头注释在这里是合适的,Uncle Bob 尽管如此。它应该解释三行的特别之处,并简要说明原因或给出解释原因的参考。
长的、解释性的名字也对你未来的自己有帮助。原因之一:它们允许您搜索所有代码以查找对它们的引用。
并且,您可以通过任何命名对象的声明放置注释以进一步解释。
所以使用好的声明和方法注释以及有意义的符号。
记住这一点。调试代码的难度是编写代码的两倍。因此,如果您使用所有的聪明才智来编写它,那么调试它就会困难得多。为未来的自己编写它有助于应对调试的困难。
现代 IDE、编辑器和运行时不会惩罚长名称。如果您将鼠标悬停在名称上,IDE 会向您显示声明注释。两者配合得很好。