是否有好的命名约定来绕过长变量名称,而不必依赖注释来获得更好的可读性?[关闭]

Are there good naming conventions to get around long variable names, without having to rely on comments for better readability? [closed]

提问人:Bratko 提问时间:3/5/2023 更新时间:3/5/2023 访问量:183

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

9个月前关闭。

基本上,我总是尽可能避免发表评论。我看了很多鲍勃叔叔的视频,关于他想表达的东西,有很多事情我同意。

他曾经提到过,理想情况下,每当我们倾向于使用注释来提供更多信息来说明我们为什么在某个函数中以这种方式做事时,那么我们可能应该反思我们实际编写的代码的质量。

当然,我知道在更大的系统中,某些事情的背景可能很难仅仅通过代码本身来解释,而内部没有任何注释。但我仍然觉得,也许我只是还不够了解,某些东西确实可以用实际代码本身来表达(鉴于我使用正确的命名约定等)

这是一个具体的例子:
我正在开发一个 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”替换的变量的名称真的很长。我的意思是它包含六个字。最近,我觉得我更努力地为变量、文件和函数命名,而不是编写逻辑来让我的程序做我想让它做的事情。

对于这个冗长的问题,我深表歉意,但是在这种情况下,如果不使用包含较少单词的变量,我就无法找到一种方法来为代码提供可读性。 任何关于您的经验的意见都是值得赞赏的。也许你的一些意见/解决方案可以帮助我,将来当我遇到类似的事情时。

Python 编码风格的 命名约定可 读性

评论

1赞 chepner 3/5/2023
我认为这与名称的选择无关(尽管冗长得离谱),而更多地是关于如何避免排长队。 在你尝试为常量找到一个更好的名称之前,已经是一个巨大的改进。AMOUNT_OF_LINES_IF_UNREADlines = self.__buttonElement.text.splitlines(); return len(lines) <= Constants.AMOUNT_OF_LINES_IF_UNREAD
1赞 chepner 3/5/2023
还有机会利用隐式换行:更改为 ,现在您可以根据需要放置换行符,将一行长行转换为 2 行或三行较短行。x <= y( x <= y )<=
1赞 chepner 3/5/2023
我建议阅读 PEP 8 以了解如何处理长线(和其他风格问题)。
0赞 Bratko 3/5/2023
感谢您提供有关 PEP 8 的提示。在这种情况下,就我个人而言,实际上更多的是关于命名,而不是线条太长。我的错是我在问题中没有表达得足够好。对不起。在这里引入局部行变量以提高可读性是我自己在脑海中已经想到的。然而,老实说,将 6 个单词轻松减少到 5 个是我完全监督的事情。
0赞 August Karlstrom 3/5/2023
我认为如果你解释第四行代表什么,你的函数的第一个版本很好。

答:

1赞 O. Jones 3/5/2023 #1

您的代码适用于三个受众群体:

  1. 运行它的机器。
  2. 任何必须为此工作的人。
  3. 你未来的自己。一旦你的代码工作,你就是它最重要的受众。

编写你的代码,以便你未来的自己能够理解它。

您向我们展示的方法中融入了一些假设。你的三条线,或者两条线,或者七条线,或者将来的任何东西,都有一些特别之处。

方法标题注释在这里是合适的,鲍勃叔叔没有。它应该解释三行的特别之处,并简要说明原因或给出解释原因的参考资料。

长而有解释性的名字对你未来的自己也很有帮助。其中一个原因是:它们允许您搜索所有代码以查找对它们的引用。

而且,您可以通过任何命名对象的声明来放置注释以进一步解释。

因此,使用良好的声明和方法注释以及有意义的符号。

请记住这一点。调试代码的难度是编写代码的两倍。因此,如果你用你所有的聪明才智来编写它,你将很难调试它。为未来的自己编写它有助于应对调试的困难。

现代 IDE、编辑器和运行时不会惩罚长名称。如果将鼠标悬停在名称上,IDE 会显示声明注释。两者可以很好地协同工作。

评论

1赞 Bratko 3/5/2023
非常感谢您在这里的输入。这正是我希望通过这个问题找到的答案。这是我将来在思考过程中始终能够考虑的事情。当然,这将有很大的帮助:D