Perl 批评的游乐园镜子

2021-07-28 01:51:37

上周的文章在 Hacker News 上得到了很好的反响,这个特别的评论引起了我的注意:我认为这是 Perl 代码可读性的真正意义所在:它为您提供了足够的灵活性,可以随心所欲地做事,因此许多程序员都面对一面镜子,将自己的不良做法反射回来。 orev, Hacker News 这就是为什么 Damian Conway 的 Perl Best Practices (2005) 是我最喜欢的书和 perlcritic 之一,代码分析器是我最喜欢的工具之一。 (虽然前者可以进行更新,而后者包括与 Conway 相矛盾的政策。)将 perlcritic 指向您的代码,也许添加一些与您的房屋风格一致的其他政策,并逐渐将严重性级别从 温和 ” 提高到野蛮。”各种糟糕的 juju 都会暴露出来,从浪费地使用 grep 到有太多的子程序参数,再到从其他包中捕获私有变量的使用。 perlcritic 提供了一个有用的行为基准,您可以随时根据自己的喜好自定义其配置。 Perl 开发人员的另一个一致性工具是 perltidy,它也具有与 Conway 兼容的配置以及其默认的 Perl 样式指南设置。我发现最重要的是,perltidy 有助于解决开发人员之间和他们的代码之间的争论,从而有助于避免过度的合并冲突。但是除了额外的工具之外,Perl 语言本身可以被弯曲甚至破坏以适应任何人的议程。那些习惯于更多束缚和纪律的语言(嗨,Java!)可能会对有时采取的长度感到反感,但根据上面的引用,这不是对语言的控诉,而是对它的更少有条不紊的程序员。这种行为中的一些可以通过 perlcritic 和 perltidy 来修复,但是其他归因于 Perl 的错误呢?这里有一些常年的最爱”:

Perl 有一个基于早期可用语言概念的极简对象系统,如数据结构(通常是散列,它与 JavaScript 相同)、包和子例程。自 1994 年 Perl 5 发布以来,使用这些工具编写了许多冗长的 OO 代码。好消息是,自 2007 年以来,我们在它们之上有一个复杂的基于元对象协议的层,称为 Moose,自 2010 年以来,一个名为 Moo 的轻量级但向前兼容的系统,以及一些更小的选项,如上所述在 Perl OO 教程中。正在等待的是 Corinna,它致力于将下一代对象功能带入 Perl 核心本身,以及 Object::Pad,它是 Corinna 中一些想法的测试平台,您今天可以在当前代码中使用这些想法。 (真的,请尝试一下——作者需要反馈!)所有这一切都是说,在 99% 的时间里,你永远不需要为类或对象属性编写 bless、构造函数或编写访问器的麻烦。比我更聪明的人已经为您完成了这项工作,您甚至可能会找到一三个您希望其他语言拥有的概念。有两个主要的:列表和标量。另一种思考方式是英语中的 复数“与单数”,希望您在阅读此博客时熟悉它。 Perl 中的某些函数根据预期返回值是列表还是标量而有不同的行为,并且函数将为其参数提供列表或标量上下文。大多数情况下,这些行为正如您所期望或希望的那样,您可以通过阅读其文档来了解函数的行为方式。您自己的函数也可以这样做,但通常没有必要,因为标量和列表都会自动解释为列表。”再次,Perl 的 DWIMmery 发挥作用。我已经写过这个了。两次。并介绍了它。两次。简短版本:Perl 有签名,但它们被认为是实验性的已经有一段时间了。与此同时,CPAN 上还有其他选择。如果你愿意,你甚至可以有类型约束。我会告诉你:在过去的一个月里,Perl 指导委员会的 Neil Bowers 一直在收集 Perl 开发人员的这些怪癖。 PSC 正在审查这个集合以寻找潜在的文档修复、错误修复、进一步讨论等。我不希望看到这项工作对语言有任何根本性的变化,但这是一个很好的迹象,表明正在解决可能令人困惑的功能。