Есть ли недостатки у автодие?
Время от времени я вижу, что люди в Stackru продвигают использование autodie. Но в коде здесь и в других местах сети я не вижу autodie очень часто. Есть ли недостатки? Потеряю ли я что-то при использовании autodie? (У меня есть идея испортиться при использовании autodie)
4 ответа
autodie
В документации перечислено несколько ошибок и ошибок, о которых вы должны знать. Тем не менее, большинство из них являются относительно незначительными, а также исправимы в долгосрочной перспективе.
Кроме этого нет никаких реальных недостатков, кроме, возможно, дополнительной зависимости при работе на старых версиях Perl. Тот факт, что он не используется очень часто, но вполне может быть вызван тем, что он является относительно новым. тем не менее, autodie
(и даже старый Fatal
модуль) вообще хорошая идея.
Технология в основном хороша, но это действие на расстоянии и волшебно. Некоторые люди, которые читают только разделы кода, могут не понимать, что происходит, так как autodie находится далеко от кода, который они проверяют. Поскольку не все используют его, и это стало практикой в последнее время, я подозреваю, что большинство людей этого не ожидают. Это не имеет большого значения, но такие вещи всегда кажутся мне безобразными.
Существует языковая модель, соответствующая функциональной парадигме C, в которой все функции возвращают значение, и пользователь должен проверить возвращаемое значение. Perl в этой группе. Если я вызываю функцию, я обязан проверить, действительно ли эта функция вернула что-то полезное.
Существует другая языковая модель, которая следует за основанной на исключениях парадигмой Java, где функции, которые терпят неудачу, возвращают исключения, и если пользователь должен обработать исключение, они должны явно обработать исключение. Большинство современных языков, написанных начиная с Java, следуют этому основанному на исключениях подходу.
Новые языки основаны на исключениях, потому что они решают проблему ленивого разработчика. В языках программирования стиля C, если разработчик забывает или не пытается проверить состояние завершения функции, программа продолжается. На языках программирования в стиле Java программа умирает. В обоих случаях разработчик может решить проблему с недопустимым результатом функции, так как языки на основе исключений заставляют разработчиков делать это.
Почему ты не видишь use autodie
Вот? Несколько теорий:
Это новое
autodie
Прагма довольно нова, и у большинства разработчиков нет хорошего способа включить новые знания в свое программирование на Perl. Например, say
был с 5.10, но я все еще вижу, что немногие разработчики используют его, хотя это большое улучшение по сравнению с print
и прост в использовании. Если разработчик не учится autodie
когда они первоначально изучат Perl, они, вероятно, никогда не узнают об этом.
В Perl нет синтаксиса Try/Catch
Вот как обычно работает Perl:
open $fh, "<", $file;
if ( not defined $fh ) {
... # What I do if `$fh` didn't get set.
}
Я проверяю ценность $fh
после моего open
заявление (Хорошо, как правило, вы проверяете возвращаемое значение open
сам а не открытый $fh
, но потерпи!) Синтаксис довольно прост и понятен. Это легко понять.
Что делать, если вы использовали autodie
и выбрал подход, основанный на исключениях? Там нет встроенного try/catch
утверждение в Perl, как есть в Java. Вместо этого вы берете полуклюжий способ использования eval
:
use autodie;
my $fh; # Got to be declared outside of the eval
eval {
open $fh, "<", $file;
}; # Don't forget that semicolon!
if ( $@ ) {
... # What I do if function "foo" doesn't return a good value...
}
Вы можете сказать, отвратительный? Я знал, что ты мог! Так как $fh
лексически ограничен, я должен объявить это до того, как eval
, Плюс, я даже не вникаю в весь вопрос $@
будучи глобальной переменной!
Это путь неполный
Большинство модулей и встроенных функций не работают с autodie
который более или менее ограничен вызовами ввода-вывода, fork
, system
, а также exec
Даже здесь это неполно print
а также flock
не работать с autodie
, Кроме этого, никакая другая встроенная функция Perl не работает с autodie
, Удаление значений из пустого массива не заставляет мою программу ломиться. Несколько модулей проверяют статус autodie
чтобы увидеть, должны ли их функции или методы croak
вместо возврата ложных значений. Таким образом, сама идея превращения Perl в язык, основанный на исключениях, не возникает.
Даже места, где вы думаете autodie
будет работать только не. Если вы используете File::Copy
чтобы получить copy
а также move
команды, не зависят от autodie
поймать плохую копию файла. Вам все еще нужно проверить возвращаемое значение copy
, Если вы используете File::IO
все ставки с autodie
выключены
Так, autodie
не вполне соответствует его смелому обещанию превратить Perl в язык программирования, основанный на исключениях. Для большинства людей это в основном ловит open
заявления, и большинство разработчиков не имеют проблем с open ... or die...
,
Мне нравится подход к разработке, основанный на исключениях, и я считаю, что по умолчанию все модули должны работать с ошибками. Заставьте разработчиков обрабатывать исключения, а не игнорировать их. Я пишу свои модули и функции, чтобы каркать, когда есть проблемы, и использую eval
обрабатывать исключения. К несчастью, autodie
просто не очень много делает прямо сейчас.
Еще одно соображение заключается в том, что autodie и utf8:: all не играли друг с другом до недавнего выпуска utf8:: all. utf8:: all - это еще один вспомогательный модуль, который, как и autodie, помогает настроить Perl для автоматического выполнения общих задач (на этот раз unicode).