Spezifikationen für Funktionen: -spec. Effiziente Nutzung

7

Wie könnte ich -spec word in erlang verwenden? Bitte geben Sie mir eine Vorstellung von der effizienten Nutzung dieses Wortes. Bedeutet das nur für Dokumentationszwecke?

Ich versuche, eine Einschränkung auf die Funktion in Modul nach Funktionstypspezifikation mit -spec anzuwenden, aber ich habe gescheitert - keine Einschränkungen wurden angewendet.

    
egor7 21.02.2012, 13:54
quelle

2 Antworten

18

-spec Attribute werden in der Tat vom Compiler und dem Laufzeitsystem als Dokumentation behandelt. Sie können Ihrem Code keine "ausführbaren Features" hinzufügen, die sie verwenden, und dasselbe gilt für die Attribute -type und -opaque .

Sie sind jedoch nützlich als:

  • Dokumentation : Sie haben mit EDoc alle Arten von Dokumentationen für Ihren Code erstellt. -spec -Attribute sind Funktionssignaturen, die je nach Aufwand den Code verständlicher und wartbarer machen. Angenommen, Ihre Lieblingsdatenstruktur in diesem Monat ist dict() . Betrachten Sie den folgenden Code:

    %Vor%

    Die Variable, die als Diktat verwendet wird, wurde als solche benannt. Aber nehmen wir an, Sie haben das folgende Snippet:

    %Vor%

    Der Versuch, damit Schritt zu halten, könnte bald zu Code führen, der dieses Dict -Suffix wiederholt. Mehr noch, Sie möchten vielleicht nicht im Kontext von my_other_function daran denken, dass die beiden Argumente dict() sind. Stattdessen sollten Sie dies tun:

    %Vor%

    Jetzt ist es klar, dass diese Argumente dict () sein sollten, damit die Funktion funktioniert und hoffentlich jeder in der Lage ist, das zu verstehen, ohne tief in den Code zu gehen. Angenommen, Sie verwenden dieses Name dict() an anderen Stellen und es speichert einige bestimmte Informationen, die mit verschiedenen APIs verfügbar gemacht werden. Dann ist es ein perfekter Kandidat für eine -type Deklaration:

    %Vor%

    Wenn jemand anderes diese spezielle Datenstruktur häufig nutzt, möchten Sie vielleicht auch diese exportieren:

    %Vor%

    Andere Module können jetzt auf diese bestimmte Datenstruktur verweisen:

    %Vor%

    Wenn Sie es vorziehen, dass andere Entwickler diese Datenstruktur in ihren Modulen nicht untersuchen, können Sie sie als -opaque deklarieren. Auch hier handelt es sich um einen "freundlichen Vorschlag", wie auch alle anderen Sachen bisher. Oder ist es ...?

  • Diskrepanzerkennung : Wenn Sie sich Zeit nehmen, um -specs und -types zu verwenden, möchten Sie sehr gerne, dass diese auf dem neuesten Stand gehalten werden. Es ist allgemein bekannt, dass niemand die Dokumentation auf dem neuesten Stand hält, wenn niemand zusieht! Zum Glück beobachtet Dialyzer . Dialyzer kann überprüfen , dass in allen Aufrufen von my_function() die Argumente sind dict() (es kann das auch ohne deine -spec -Anmerkungen tun, aber es ist so leichter, wenn es diese auch gibt) und schreie blutigen Mord, wenn du es mit etwas anderem nennst. Es kann außerdem diese exportierten Typen verfolgen und sogar Deckkraftverletzungen melden. Es ist also nicht "nur Dokumentation".

  • Testfallgenerierung : PropEr kann mit den Definitionen -spec und -type Ihre Funktionen automatisch mit zufälligen Testfällen überprüfen. Es ist in der Lage, sogar aus solchen Deklarationen zufällige Testfälle zu machen:

    %Vor%
  • Die brandneue Möglichkeit, eine Reihe von Callbacks für ein Verhalten anzugeben, besteht in der Verwendung der vertrauten -spec -Syntax. Compiler, Dialyzer und möglicherweise andere Tools können diese Informationen verwenden, um eine Verhaltensimplementierung zu überprüfen. Weitere Informationen finden Sie in den OTP-Verhalten Code und hier

Lesen Sie mehr hier .

    
aronisstav 21.02.2012, 21:05
quelle
8

-spec s für Funktionen sind Spezifikationen, die an mehreren Stellen hilfreich sind:

  • Sie dienen als Dokumentation der Funktion. Durch die Erstellung von EDoc werden die Spezifikationen abgerufen und in der Dokumentation verfügbar gemacht.
  • Sie sind eine Spezifikation für den Dialysator. Wenn der Dialysator läuft, wird er anhand der Spezifikationen feststellen, ob der Code in irgendeiner Weise falsch ist. Das heißt, wenn die Spezifikation falsch ist - und in einigen Fällen wird es dem System helfen, genau zu verstehen, warum der Code auch falsch ist.
  • Sie sind ein wertvolles Werkzeug bei der Spezifikation von Verhaltensweisen. Es gibt ein neues -callback -Schlüsselwort, das dazu verwendet werden kann, dies für behaviorale APIs zu tun.
  • Sie sind wertvoll für den Aufbau eines Typskeletts, wie das Programm zusammenpasst und woher die Daten kommen.
  • Zusammen mit den Cousins -type und -opaque können Sie festlegen, dass bestimmte Typen für Codeabschnitte undurchsichtig sind. Das bedeutet, dass Sie die interne Repräsentation auf einer statischen Verifizierungsebene nicht sehen dürfen. Dies kann wiederum helfen, modularisierten Code zu betreiben, da Sie Codeteile nicht fest koppeln dürfen.
I GIVE CRAP ANSWERS 21.02.2012 14:07
quelle

Tags und Links