Должен ли я использовать общий:: смысл или просто придерживаться `use strict` и` use warnings`?
Недавно я установил модуль из CPAN и заметил, что одна из его зависимостей была common:: 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);
Сохранить для undef
предупреждений, иногда являющихся суматохой, я обычно обнаружил, что стандартные предупреждения являются хорошими. Стоит ли переключиться на common::sense
вместо обычного use strict; use warnings;
?
Ответы
Ответ 1
В то время как мне нравится идея сокращения кода котельной плиты, я глубоко подозрительно отношусь к инструментам вроде Modern:: Perl и common:: sense.
Проблема с такими модулями заключается в том, что они группируют группу поведений и скрывают имена glib с изменяемыми значениями.
Например, Modern::Perl
сегодня состоит из включения некоторых функций perl 5.10 и использования строгих и предупреждений. Но что происходит, когда Perl 5.12 или 5.14 или 5.24 выходят с отличными новыми позитивами, и сообщество обнаруживает, что нам нужно использовать прагму frobnitz
повсюду? Будет ли Modern:: Perl обеспечивать последовательный набор поведений или он останется "современным". Если MP поддерживает время, он нарушит существующие системы, которые не будут блокировать шаг с требованиями своего компилятора. Он добавляет дополнительное тестирование совместимости для обновления. По крайней мере, моя реакция на депутата. Я буду первым, кто признает, что хроматический примерно в 10 раз умнее меня и лучший программист, но я все еще не согласен с его решением по этому вопросу.
common::sense
также имеет проблему с именем. В чью идею здравого смысла? Будет ли это изменяться с течением времени?
Мое предпочтение было бы для модуля, который упростит мне создание моего собственного набора стандартных модулей и даже создание групп связанных модулей/прагм для конкретных задач (например, манипулирование датами, взаимодействие с базами данных, синтаксический анализ html и т.д.).
Мне нравится идея Toolkit, но она отсасывает по нескольким причинам: использует фильтры источников, а макросистема слишком сложна и хрупкой. Я очень уважаю Дамиана Конвей, и он производит яркий код, но иногда он слишком далеко (по крайней мере, для использования в производстве, экспериментирование - это хорошо).
Я не потерял достаточно времени, набрав use strict; use warnings;
, чтобы почувствовать необходимость создания моего собственного стандартного модуля импорта. Если бы я почувствовал сильную потребность в автоматической загрузке набора модулей/прагм, то было бы идеально похоже на Инструментарий, который позволяет создавать стандартные группы функций:
use My::Tools qw( standard datetime SQLite );
или
use My::Tools;
use My::Tools::DateTime;
use My::Tools::SQLite;
Инструментарий очень близок к моему идеалу. Его фатальные дефекты - облом.
Что касается выбора прагмы, то это вопрос вкуса. Я бы предпочел использовать случайные no strict 'foo'
или no warnings 'bar'
в блоке, где мне нужна возможность сделать что-то, что ему требуется, чем отключить проверки всего моего файла. Кроме того, IMO, потребление памяти - это красная селедка. YMMV.
Обновление
Кажется, что существует много (сколько?) разных модулей этого типа, плавающих вокруг CPAN.
- latest, который больше не является последним. Демонстрирует часть проблемы с именами.
- Кроме того, uni::perl, который добавляет разрешающую юникодную часть микса.
- ToolSet предлагает подмножество возможностей
Toolkit
, но без фильтров источников.
- Здесь я включу Moose, так как он автоматически добавляет
strict
и warnings
в вызывающий пакет.
- И, наконец, Acme::Very::Modern::Perl
Распространение этих модулей и возможность перекрытия требований добавляет еще одну проблему.
Что произойдет, если вы напишете код типа:
use Moose;
use common::sense;
Какие прагмы включены с какими параметрами?
Ответ 2
Я бы сказал, придерживайтесь warnings
и strict
по двум основным причинам.
- Если другие люди будут использовать или работать с вашим кодом, они (почти наверняка) используются для
warnings
и strict
и их правил. Они представляют собой норму сообщества, с которой вы и другие люди, с которыми вы работаете, могут рассчитывать.
- Даже если тот или иной конкретный фрагмент кода подходит именно вам, вы, вероятно, не хотите беспокоиться о том, чтобы вспомнить "Является ли это проектом, в котором я придерживаюсь
warnings
и strict
, или тем, где я обращаюсь к common::sense
?" Движение вперед и назад между двумя режимами просто смутит вас.
Ответ 3
Есть один бит, который больше никто не подобрал, и что FATAL
в списке warnings
.
Итак, начиная с 2.0, use common::sense
более сродни:
use strict;
use warnings FATAL => 'all'; # but with the specific list of fatals instead of 'all' that is
Это несколько важная и часто упускаемая особенность предупреждений, которые ограничивают строгость в целом выше. Вместо undef string интерполяции или бесконечной рекурсии, просто предупреждающей вас, а затем продолжающегося несмотря на проблему, она фактически останавливается.
Мне это полезно, потому что во многих случаях интерполяция undef string приводит к еще более опасным ошибкам, которые могут незаметно оставаться незаметными, а сбой и подкачка - это хорошо.
Ответ 4
У меня, очевидно, нет здравого смысла, потому что я больше собираюсь Modern::Perl
; -)
Ответ 5
"Использование более низкой памяти" работает только в том случае, если вы не используете модули, которые загружают строгие, функции, предупреждения и т.д., а "большая" часть - это не так много.
Ответ 6
Не все идеи здравого смысла одинаковы - в этом отношении это ничего, кроме общего.
Пойдите с тем, что вы знаете. Если вы получаете предупреждения undef
, скорее всего, ваша программа или ее ввод неверны.
Предупреждения существуют по какой-то причине. Все, что их уменьшает, не может быть полезным. (Я всегда компилирую с помощью gcc -Wall
тоже...)
Ответ 7
У меня никогда не было предупреждения, что в моем коде не было ничего хитрого/просто неправильно. Для меня всегда что-то технически разрешено, что я почти не хочу делать. Я думаю, что полный набор предупреждений неоценим. Если на данный момент вы находите use strict
+ use warnings
, я не понимаю, почему вы хотите перейти на использование нестандартного модуля, который затем является зависимостью для каждого фрагмента кода, который вы пишете здесь...
Ответ 8
Когда дело доходит до предупреждений, я поддерживаю использование любого модуля или встроенной языковой функции, которая дает вам уровень предупреждений, который поможет вам сделать ваш код надежным и надежным, каким он может быть. Предупреждающее предупреждение никому не помогает.
Но если вам нравятся стандартные предупреждения, придерживайтесь их. Кодирование по более строгому стандарту велико, если вы привыкли к этому! Я бы не рекомендовал переключение только для экономии памяти. Переключайте только, если модуль поможет вам быстрее и с большей уверенностью превратить ваш код.
Ответ 9
Многие люди спорят в комментариях о том, что, если MP изменится, он сломает ваш код. Хотя это может быть реальной угрозой, здесь уже много вещей, что со временем меняются и нарушают код (иногда после цикла устаревания, иногда нет...).
Некоторые другие модули изменили API, поэтому ломают вещи, и никто не заботится о них. Например. Moose
имеет по крайней мере две вещи, которые устарели сейчас и, вероятно, будут запрещены в некоторых будущих выпусках.
Еще один пример: много лет назад было разрешено писать
for $i qw(some words)
теперь он устарел. И многие другие... И это синтаксис языка CORE.
Все выжили. Таким образом, не совсем понятно, почему многие люди утверждают вспомогательные модули-повторители. Когда они собираются измениться, (вероятно) здесь будет своего рода цикл устаревания... Итак, мой взгляд таков:
- если вы пишете программы себе, используйте любой модуль, который вы хотите;)
- Если вы пишете программу кому-то, где кто-то другой собирается ее использовать, используйте минимальные нестандартные "прагма-подобные" модули (common:: sense, modern:: perl, uni:: perl и т.д.)
- в вопросах stackoverflow вы можете безопасно использовать
common::sense
или Modern::Perl
и т.д. - большинство пользователей, которые ответят, ваши вопросы, узнают их. Все понимают, чем проще написать use 5.010;
для включения strict, warnings and fearures
с 10 символами, как с 3 строками...