Как вы выполняете проект по контракту на Perl?
Я изучаю использование DbC в наших проектах Perl, и я пытаюсь найти лучший способ проверить контракты в источнике (например, проверить условия pre/post, инварианты и т.д.)
Class:: Contract был написан Дамианом Конвеем и теперь поддерживается К. Гарретом Гебелем, но похоже, что он не был затронутых более 8 лет.
Похоже, что я хочу использовать Moose, так как кажется, что он может предложить функциональность, которая может быть использована для DbC, но мне было интересно, есть ли у кого-нибудь ресурсы (статьи и т.д.) о том, как это сделать, или если есть какие-то полезные модули, которые я не смог найти.
Кто-нибудь делает DbC с Perl? Должен ли я просто "прыгать" в Муз и посмотреть, что я могу сделать для меня?
Ответы
Ответ 1
Лось дает вам много инструментов (если не весь сахар), чтобы делать DbC. В частности, вы можете использовать крючки метода before, after и around (здесь некоторые примеры) для выполнения любых утверждений, которые вы можете использовать для аргументов и возвращаемых значений.
В качестве альтернативы "сворачивать свой собственный DbC" вы можете использовать модуль, например MooseX::Method::Signatures или MooseX::Method, чтобы позаботиться о проверке параметров, переданных подпрограмме. Эти модули не обрабатывают "пост" или "инвариантные" проверки, которые обычно предоставляют DbC.
EDIT: Мотивированный этим вопросом, я взломал MooseX::Contract и загрузил его в CPAN. Мне было бы интересно получить обратную связь по API, поскольку я никогда не использовал DbC из первых рук.
Ответ 2
Moose - отличная система oo для perl, и я от всей души рекомендую ее для любых объектов кодирования в perl. Вы можете указать "подтипы" для ваших членов класса, которые будут применяться в случае, когда они устанавливаются аксессуарами или конструкторами (одну и ту же систему можно использовать с пакетом Moose:: Methods для функций). Если вы кодируете несколько лайнеров, используйте Moose;
Что же касается DbC, ну, может быть, он не подходит для perl5. Это будет сложно на языке, который предлагает вам очень мало гарантий. Лично, во многих динамичных языках, но особенно в perl, я склонен делать свою руководящую философию DRY и основанную на тестах разработку.
Ответ 3
Я бы также рекомендовал использовать Moose.
Однако в качестве "альтернативы" посмотрите Sub:: Contract.
Процитировать автора....
Sub:: Contract предлагает прагматичный способ реализации частей программирования по контрактной парадигме в Perl.
Sub:: Контракт не является основой дизайна по контракту.
Sub:: Contract нацелен на то, чтобы очень легко было ограничить входные аргументы подпрограмм и вернуть значения, чтобы эмулировать сильную типизацию во время выполнения.
Ответ 4
Если вам не нужны инварианты класса, я нашел следующую рекомендацию для Perl Hacks, чтобы быть хорошим решением для некоторых программ. См. Smart::Comments
.