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.
-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:
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:
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:
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:
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 .
-spec
s für Funktionen sind Spezifikationen, die an mehreren Stellen hilfreich sind:
-callback
-Schlüsselwort, das dazu verwendet werden kann, dies für behaviorale APIs zu tun. -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. Tags und Links erlang