我应该使用common :: sense还是坚持使用`use strict`和`use warnings`?

Dre*_*ens 15 perl

我最近从CPAN安装了一个模块,并注意到它的一个依赖项是常见的:: sense,一个模块,它提供了你想要的所有警告,没有你不需要的.从模块的概要:

use common::sense;

# supposed to be the same, with much lower memory usage, as:
#
# use strict qw(vars subs);
# use feature qw(say state switch);
# no warnings;
# use warnings qw(FATAL closed threads internal debugging pack substr malloc
#                 unopened portable prototype inplace io pipe unpack regexp
#                 deprecated exiting glob digit printf utf8 layer
#                 reserved parenthesis taint closure semicolon);
# no warnings qw(exec newline);
Run Code Online (Sandbox Code Playgroud)

除了undef警告有时候很麻烦,我通常会发现标准警告是好的.是否值得转换common::sense而不是我的正常use strict; use warnings;

dao*_*oad 24

虽然我喜欢减少样板代码的想法,但我对Modern :: Perl和common :: sense等工具深感怀疑.

我对这些模块的问题在于它们捆绑了一组行为并隐藏了具有可变含义的behid glib名称.

例如,Modern::Perl今天包括启用一些perl 5.10功能并使用严格和警告.但是当Perl 5.12或5.14或5.24带来了很多新的好东西时会发生什么,并且社区发现我们需要在frobnitz任何地方使用pragma?将Modern :: Perl提供一系列一致的行为,还是保持"现代".如果MP与时间保持一致,它将破坏不与其编译器要求保持锁定步骤的现有系统.它增加了额外的兼容性测试以升级.至少那是我对议员的反应.我是第一个承认色彩比我聪明10倍的人,也是一个更好的程序员 - 但我仍然不同意他对这个问题的判断.

common::sense也有名字问题.涉及谁的常识的想法?它会随着时间而改变吗?

我倾向于使用一个模块,使我可以轻松创建自己的标准模块集,甚至为特定任务创建相关模块/编译指示组(如日期时间操作,数据库交互,html解析等).

我喜欢Toolkit的想法,但它有两个原因:它使用源过滤器,宏系统过于复杂和脆弱.我非常尊重达米安康威,并且他制作了出色的代码,但有时他会走得太远(至少在生产中使用,实验很好).

我没有输入足够的时间use strict; use warnings;来感觉需要创建我自己的标准导入模块.如果我觉得强烈需要自动加载一组模块/编译指示,那么类似于Toolkit的东西可以创建标准功能组,这是理想的:

use My::Tools qw( standard datetime SQLite );
Run Code Online (Sandbox Code Playgroud)

要么

use My::Tools;
use My::Tools::DateTime;
use My::Tools::SQLite;
Run Code Online (Sandbox Code Playgroud)

工具包非常接近我的理想.它的致命缺陷令人失望.

至于pragma的选择是否有意义,这是一个品味问题.我宁愿偶尔no strict 'foo'no warnings 'bar'在一个块中使用我需要能力做一些需要它的东西,而不是禁用对整个文件的检查.另外,IMO,内存消耗是一个红色的鲱鱼.因人而异.

更新

似乎有很多(多少?)这种类型的不同模块漂浮在CPAN周围.

这些模块的激增以及需求重叠的可能性增加了另一个问题.

如果您编写如下代码会发生什么:

use Moose;
use common::sense;
Run Code Online (Sandbox Code Playgroud)

哪些pragma启用了什么选项?

  • Modern :: Perl将允许您明确指出您正在购买的"现代"版本.像"使用Modern :: Perl'2009'"或类似的东西. (7认同)
  • 好悲伤!几年前我试图说的所有内容都是"使用严格;使用警告;"? (7认同)
  • @mpeters,所以为了理解给定的MP调用,我必须成为Perl历史学家吗?不用了,谢谢.但是,信息是++. (6认同)
  • 优点,人们常常不会考虑他们选择名称的未来影响.虽然mpeters是正确的 - 避免完全混乱的关键是(某种形式)版本控制.这使得理解给定调用变得更加困难,但这比具有从您下面改变的语义的无版本模块更好.也就是说,一个简洁的功能描述名称会更好,并且可以更好地组合您自己的任意模块组. (3认同)
  • @Kent,问题是什么构成了"现代"Perl实践保证会改变.此外,当Perl 5.12问世并且MP开始要求将5.12中的新功能作为其默认设置时,我必须修复所有现有的工作代码以使用Modern :: Perl :: 2009或2010等.随着时间的推移情况变得更糟.所有这些问题都存在于任何依赖关系中,但其他依赖关系并不能保证随着时间的推移而突破. (2认同)
  • @hobbs,太糟糕了`使用Modern :: Perl'2009-10'`没有记录为API的一部分,*今天*:) http://search.cpan.org/dist/Modern-Perl-1.03/lib /Modern/Perl.pm (2认同)

Tel*_*hus 15

我会说坚持warnings并且strict主要有两个原因.

  1. 如果其他人要使用或与您的代码的工作,他们是(几乎肯定),用于warningsstrict与他们的规则.这些代表了您和您合作的其他人可以信赖的社区规范.
  2. 即使这个那个特定的代码块是只为你,你可能不希望担心记住"这是我坚持到项目warningsstrict或一个地方我槎到common::sense?" 在两种模式之间来回移动会让您感到困惑.

  • +1,尽可能减少认知负荷.此外,如果存在特定的警告/严格违规,但是您知道代码正在做正确的事情,请隔离在块内触发它的最小代码段并放入"无警告"; 或"没有严格;" 在里面. (3认同)

Ken*_*ric 15

似乎没有其他人接受过,这就FATALwarnings列表中.

从2.0开始,use common::sense更类似于:

use strict; 
use warnings FATAL => 'all'; # but with the specific list of fatals instead of 'all' that is 
Run Code Online (Sandbox Code Playgroud)

这是一个有点重要且经常被忽视的警告特征,它将严格程度提高了一个整体.而不是undef字符串插值,或无限递归只是警告你,然后尽管问题继续前进,它实际上停止.

对我来说这很有用,因为在很多情况下,undef字符串插值会导致更多危险的错误,这些错误可能会被忽视,而失败和失败是一件好事.


dra*_*tun 8

我显然没有常识,因为我更多的是为了Modern::Perl ;-)

  • @EvanCarroll 请在投票前仔细阅读答案。我的回答是第一个提到 Modern::Perl CPAN 模块(用于替代 common::sense)。 (2认同)

yst*_*sth 7

该"更低的内存使用率"只有当你使用的作品没有模块加载严格,特征,警告等与"多"的部分是......不是所有的东西.

  • 几百卢比,老实说比一些人可能*期望*更多,但它仍然是一滴水.它几乎都是可共享的内存.不像库的文本部分那样"共享",但如果某些东西使用警告然后分叉,基本上400kB左右都不会被COWed. (2认同)

Aln*_*tak 6

不是每个人对常识的看法都是一样的 - 在这方面它不是常见的.

跟你所知道的去吧.如果收到undef警告,则可能是您的程序或其输入不正确.

警告是有原因的.任何减少它们的东西都无济于事.(我总是编译gcc -Wall...)

  • 或者你得到一个错误的哈希键,或者你认为*不能*返回undef的函数已经返回undef,或者你的控制流中有一个漏洞......以几个价格明确检查定义是可接受的价格在检测那些*其他*错误时付出一点帮助:) (4认同)
  • Undef警告通常只是意味着我忘了质量与`定义$ foo && ..`的字符串比较..;) (3认同)

ire*_*ses 5

在我的代码中,我从未收到任何狡猾/完全错误的警告.对我来说,技术上总是允许的,我几乎肯定不想做.我认为全套警告非常宝贵.如果你现在发现use strict+ use warnings足够了,我不明白你为什么要改用一个非标准模块,这个模块就是你从这里开始编写的每一段代码的依赖...