提问人:Bratko 提问时间:3/5/2023 更新时间:3/5/2023 访问量:183
是否有好的命名约定来绕过长变量名称,而不必依赖注释来获得更好的可读性?[关闭]
Are there good naming conventions to get around long variable names, without having to rely on comments for better readability? [closed]
问:
基本上,我总是尽可能避免发表评论。我看了很多鲍勃叔叔的视频,关于他想表达的东西,有很多事情我同意。
他曾经提到过,理想情况下,每当我们倾向于使用注释来提供更多信息来说明我们为什么在某个函数中以这种方式做事时,那么我们可能应该反思我们实际编写的代码的质量。
当然,我知道在更大的系统中,某些事情的背景可能很难仅仅通过代码本身来解释,而内部没有任何注释。但我仍然觉得,也许我只是还不够了解,某些东西确实可以用实际代码本身来表达(鉴于我使用正确的命名约定等)
这是一个具体的例子:
我正在开发一个 Telegram 机器人,它需要从频道内的消息中检索数据,然后转发到系统其余部分的其他组件。由于该项目的限制,我只能使用 Selenium Webdriver 来执行此操作。目前,我在选择正确的命名约定方面确实遇到了麻烦。
我发现目前,我可以通过其可点击的 WebElement 对象检查特定 Telegram 频道是否有 urnead 消息。它有一个字符串成员变量“text”,其中包含 3 行,因为没有可用的未读消息。但是,如果有未读消息可用,则成员变量 “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”替换的变量的名称真的很长。我的意思是它包含六个字。最近,我觉得我更努力地为变量、文件和函数命名,而不是编写逻辑来让我的程序做我想让它做的事情。
对于这个冗长的问题,我深表歉意,但是在这种情况下,如果不使用包含较少单词的变量,我就无法找到一种方法来为代码提供可读性。 任何关于您的经验的意见都是值得赞赏的。也许你的一些意见/解决方案可以帮助我,将来当我遇到类似的事情时。
答:
您的代码适用于三个受众群体:
- 运行它的机器。
- 任何必须为此工作的人。
- 你未来的自己。一旦你的代码工作,你就是它最重要的受众。
编写你的代码,以便你未来的自己能够理解它。
您向我们展示的方法中融入了一些假设。你的三条线,或者两条线,或者七条线,或者将来的任何东西,都有一些特别之处。
方法标题注释在这里是合适的,鲍勃叔叔没有。它应该解释三行的特别之处,并简要说明原因或给出解释原因的参考资料。
长而有解释性的名字对你未来的自己也很有帮助。其中一个原因是:它们允许您搜索所有代码以查找对它们的引用。
而且,您可以通过任何命名对象的声明来放置注释以进一步解释。
因此,使用良好的声明和方法注释以及有意义的符号。
请记住这一点。调试代码的难度是编写代码的两倍。因此,如果你用你所有的聪明才智来编写它,你将很难调试它。为未来的自己编写它有助于应对调试的困难。
现代 IDE、编辑器和运行时不会惩罚长名称。如果将鼠标悬停在名称上,IDE 会显示声明注释。两者可以很好地协同工作。
评论
AMOUNT_OF_LINES_IF_UNREAD
lines = self.__buttonElement.text.splitlines(); return len(lines) <= Constants.AMOUNT_OF_LINES_IF_UNREAD
x <= y
( x <= y )
<=