Я хочу упомянуть здесь два момента.
Первый - это тесты, второй - вопрос производительности.
1) Тесты
Вы упомянули, что тесты могут многое, и что тесты - единственный способ
чтобы быть уверенным, что ваш код правильный. В общем, я бы сказал, что это
абсолютно правильно. Но тесты сами по себе решают только одну проблему.
Если вы пишете модуль, у вас есть две проблемы или, скажем, две разные
люди, которые используют ваш модуль.
Вы как разработчик и пользователь, который использует ваш модуль. Тесты помогают с
Во-первых, ваш модуль правильный и правильно делает, но это не так
помогите пользователю, который просто использует ваш модуль.
Для последующего у меня есть один пример. я написал модуль, используя лося
и некоторые другие вещи, мой код всегда заканчивался ошибкой сегментации.
Затем я начал отлаживать свой код и искать проблему. Я провожу
4 часа времени, чтобы найти ошибку. В конце концов проблема заключалась в том, что у меня есть
использовал лося с чертой массива. Я использовал функцию «карта», и я не сделал
обеспечить функцию подпрограммы, просто строку или что-то еще.
Конечно, это была моя абсолютно глупая ошибка, но я трачу много времени на
отладить это. В конце просто проверка ввода, что аргумент
Подразделение будет стоить разработчику 10 секунд времени и будет стоить мне
и, вероятно, другие гораздо больше времени.
Я также знаю другие примеры. Я написал REST-клиент для интерфейса
полностью ООП с лосем. В конце концов вы всегда возвращали объекты, вы
может изменить атрибуты, но уверен, что он не вызывает REST API для
каждое изменение, которое вы сделали. Вместо этого вы меняете свои ценности и в конце концов вы
вызовите метод update (), который передает данные, и измените значения.
Теперь у меня был пользователь, который тогда написал:
$obj->update({ foo => 'bar' })
Конечно, я получил ошибку, что update () не работает. Но уверен, что это не так
работать, потому что метод update () не принимает хэш-ссылки. Это только делает
синхронизация фактического состояния объекта с онлайн
оказание услуг. Правильный код будет.
$obj->foo('bar');
$obj->update();
Первое работает, потому что я никогда не проверял аргументы. И я не выкидываю ошибку, если кто-то дает больше аргументов, чем я ожидаю. Метод просто начинает нормально, как.
sub update {
my ( $self ) = @_;
...
}
Конечно, все мои тесты работают нормально на 100%. Но обрабатывая эти ошибки,
ошибки не стоят мне времени тоже. И это стоит пользователю, вероятно, много
больше времени.
Итак, в конце концов. Да, тесты - единственный верный способ убедиться, что ваш код
работает правильно. Но это не значит, что проверка типов не имеет смысла.
Проверка типов поможет всем не разработчикам (в вашем модуле)
правильно использовать ваш модуль. И экономит вам и другим время нахождения
ошибки дампа.
2) Производительность
Короче говоря: вы не заботитесь о производительности, пока вы не заботитесь.
Это означает, что пока ваш модуль не будет работать медленно, производительность всегда будет высокой
достаточно, и вам не нужно заботиться об этом. Если ваш модуль действительно работает
чтобы замедлить, вам нужны дополнительные исследования. Но для этих исследований
Вы должны использовать профилировщик, такой как Devel :: NYTProf, чтобы посмотреть, что медленно.
И я бы сказал. В 99% медлительность не потому что вы печатаете
проверка, это больше твой алгоритм. Вы делаете много вычислений, вызывая
функции часто и т. д. Часто это помогает, если вы делаете полностью другие решения
использовать другой лучший алгоритм, сделать кэширование или что-то еще, и
снижение производительности не ваша проверка типов. Но даже если проверка
хит производительности. Затем просто удалите его там, где это важно.
Нет причин оставлять проверку типов там, где производительность не
вопросы. Как вы думаете, проверка типов имеет значение в случае, как указано выше?
Где я написал REST Client? 99% проблем с производительностью здесь
количество запросов, поступающих в веб-сервис, или время для такого
запрос. Не используйте проверку типов, MooseX :: Declare и т. Д.
ускорить абсолютно ничего.
И даже если вы видите недостатки производительности. Иногда это приемлемо.
Потому что скорость не имеет значения, а иногда что-то дает вам больше
значение. DBIx :: Class медленнее, чем чистый SQL с DBI, но DBIx :: Class
дает вам много за это.