Подтвердить что ты не робот

Как вы выполняете проект по контракту на Perl?

Я изучаю использование DbC в наших проектах Perl, и я пытаюсь найти лучший способ проверить контракты в источнике (например, проверить условия pre/post, инварианты и т.д.)

Class:: Contract был написан Дамианом Конвеем и теперь поддерживается К. Гарретом Гебелем, но похоже, что он не был затронутых более 8 лет.

Похоже, что я хочу использовать Moose, так как кажется, что он может предложить функциональность, которая может быть использована для DbC, но мне было интересно, есть ли у кого-нибудь ресурсы (статьи и т.д.) о том, как это сделать, или если есть какие-то полезные модули, которые я не смог найти.

Кто-нибудь делает DbC с Perl? Должен ли я просто "прыгать" в Муз и посмотреть, что я могу сделать для меня?

4b9b3361

Ответ 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.