2009-01-13 10 views
12

Ich verwende DBC in unseren Perl-Projekten zu untersuchen, und ich versuche, den besten Weg zu finden, Verträge in der Quelle zu überprüfen (zB Überprüfung Pre/Post-Bedingungen, Invarianten, etc.) vonWie machen Sie Design by Contract in Perl?

Class::Contract geschrieben wurde Damian Conway und wird jetzt von C. Garret Goebel gepflegt, aber es sieht so aus, als ob es seit über 8 Jahren nicht mehr berührt wurde.

Es sieht so aus, als ob ich Moose verwenden möchte, da es so aussieht, als könnte es Funktionalität bieten, die für DbC verwendet werden könnte, aber ich fragte mich, ob jemand irgendwelche Ressourcen (Artikel, etc.) hatte Darüber oder wenn es irgendwelche hilfreichen Module gibt, die ich nicht finden konnte.

Wer macht DbC mit Perl? Soll ich einfach zu Moose "springen" und sehen, was ich für mich tun kann?

+0

@brian: Ich denke, das ist der direkteste Weg, um die Frage zu stellen. Trotzdem keine Abnehmer. :) –

+1

@Adam - Ich habe meine Antwort bearbeitet, um einen Link zu MooseX :: Contract hinzuzufügen. Werfen Sie einen Blick und lassen Sie mich wissen, was Sie denken. –

+0

@Brian: Ich wünschte, ich könnte dich wieder auffordern! Sehen Sie meinen Kommentar zu Ihrer Antwort unten. Ich bin mir nicht sicher, wann ich Zeit haben werde, es auszuprobieren. –

Antwort

10

Moose gibt Ihnen viele Werkzeuge (wenn nicht der ganze Zucker), um DbC zu machen. Insbesondere können Sie die Before, After- und Around-Methoden-Hooks (here'ssome examples) verwenden, um alle Behauptungen auszuführen, die Sie möglicherweise für Argumente und Rückgabewerte ausführen möchten.

Als Alternative zum "eigenen DbC" können Sie ein Modul wie MooseX::Method::Signatures oder MooseX::Method verwenden, um die Validierung von Parametern zu überprüfen, die an ein Unterprogramm übergeben werden. Diese Module verarbeiten jedoch nicht die "Post" - oder "invarianten" Validierungen, die DbC normalerweise bietet.

EDIT: Motiviert durch diese Frage habe ich zusammen MooseX::Contract gehackt und es auf den CPAN hochgeladen. Ich wäre neugierig, Feedback zu der API zu bekommen, da ich DbC nie wirklich aus erster Hand benutzt habe.

+0

Das ist großartig, es sieht so aus, als ob es die Fälle behandelt, nach denen ich gefragt habe. Unglücklicherweise bin auch ich neu im DbC-Paradigma, daher weiß ich nicht, ob ich die beste Person bin, um Ihre API zu beurteilen. :) –

+1

Würden Sie im Nachhinein immer noch mit diesem Thema gehen? Oder würden Sie stattdessen 'Function :: Parameters' und' Return :: Types' für mindestens die Ein- und Ausgänge empfehlen? –

2

Moose ist ein ausgezeichnetes System für Perl, und ich empfehle es für jeden, der Objekte in Perl programmiert. Sie können "Subtypen" für Ihre Klassenmitglieder angeben, die erzwungen werden, wenn sie von Accessoren oder Konstruktoren gesetzt werden (dasselbe System kann mit dem Moose :: Methods-Paket für Funktionen verwendet werden). Wenn Sie mehr als einen Liner codieren, verwenden Sie Moose;

Wie für DbC, vielleicht nicht die beste Lösung für Perl5. In einer Sprache, die Ihnen sehr wenige Garantien bietet, wird es schwierig. Persönlich, in vielen dynamischen Sprachen, vor allem aber in Perl, tendiere ich dazu, meine Leitphilosophie DRY und testgetriebene Entwicklung zu machen.

+0

Danke, Todd. Ich hatte ein schleichendes Gefühl, das vielleicht der vorherrschende Standpunkt war, aber da Damian irgendwann entschieden hatte, dass es sich lohnte, ein Modul zu schreiben, dachte ich, dass es vielleicht funktionieren könnte. Ich denke, nur sie wissen, ob sie es aufgegeben haben, weil es sich nicht gelohnt hat. –

2

Ich würde auch empfehlen, Moose zu verwenden.

Aber als "Alternative" werfen Sie einen Blick auf Sub::Contract.

den Autor zu zitieren ....

Sub :: Vertrag bietet eine pragmatische Art und Weise Teile der Programmierung durch Vertrag Paradigma in Perl zu implementieren.

Sub :: Contract ist kein Design-by-Contract-Framework.

Sub :: Contract zielt darauf ab, es sehr einfach zu machen, Subroutinen-Eingabeargumente einzuschränken und Werte zurückzugeben, um starke Typisierung zur Laufzeit zu emulieren.

1

Wenn Sie keine Klasseninvarianten benötigen, habe ich die folgende Perl Hacks Buchempfehlung als eine gute Lösung für einige Programme gefunden. Siehe Smart::Comments.