Frage

Wikipedia sagte früher* darüber Ententippen:

In der Computerprogrammierung mit objektorientierte Programmiersprachen, Duck Typing ist eine Art von dynamischer Typisierung, bei der die aktuelle Satz von Methoden und Eigenschaften bestimmt die gültige Semantik, sondern als sein Erbe von einem bestimmten Klasse oder Implementierung einer bestimmten Schnittstelle.

(* Hrsg.Notiz:Da diese Frage gestellt wurde, wurde der Wikipedia-Artikel bearbeitet, um das Wort „dynamisch“ zu entfernen.)

Es heißt etwa Strukturtypisierung:

Ein strukturiertes System (oder ein Eigenschafts-basierter Typsystem) ist eine Hauptklasse des Typsystems, in der die Typkompatibilität und Äquivalenz durch die Struktur des Typs und nicht durch explizite Deklarationen bestimmt werden.

Es stellt die strukturelle Untertypisierung der Ententypisierung gegenüber:

Struktursysteme] Kontrast zu ...Ententypisierung, bei dem nur der Teil der zur Laufzeit zugegriffenen Struktur auf Kompatibilität überprüft wird.

Allerdings ist der Begriff Ententippen scheint mir zumindest intuitiv strukturelle Untertypisierungssysteme zu subsumieren.Tatsächlich sagt Wikipedia:

Der Name des Konzepts [Enten-Typing] bezieht sich auf die Ententest, die der James Whitcomb Riley, der wie folgt formuliert werden kann: folgt:"Wenn ich einen Vogel sehe, der läuft wie eine Ente und schwimmt wie eine Ente und quakt wie eine Ente, ich nenne diesen Vogel einen Ente."

Meine Frage ist also:Warum kann ich strukturelle Subtypisierung nicht als Ententypisierung bezeichnen?Gibt es überhaupt dynamisch typisierte Sprachen, die nicht auch als ententypisiert klassifiziert werden können?

Nachtrag:

Als jemand namens Tagtraumbetrunken auf reddit.com also eloquent ausgedrückt „Wenn es wie eine Ente kompiliert und wie eine Ente verknüpft wird …“

Post-Postscript

Viele Antworten scheinen im Grunde nur eine Wiederholung dessen zu sein, was ich hier bereits zitiert habe, ohne auf die tiefere Frage einzugehen: Warum also nicht den Begriff „Duck-Typing“ verwenden, um sowohl dynamische Typisierung als auch strukturelle Untertypisierung abzudecken?Wenn Sie nur über Duck-Typing und nicht über strukturelle Subtypisierung sprechen möchten, dann nennen Sie es einfach so, wie es ist: dynamische Mitgliedersuche.Mein Problem ist, dass nichts über den Begriff steht Ententippen sagt mir, das gilt nur für dynamische Sprachen.

War es hilfreich?

Lösung

C++- und D-Vorlagen sind ein perfektes Beispiel für nicht dynamisches Duck-Typing.Es ist definitiv:

Typisierung, bei der ein den aktuellen Methodensatz des Objekts und -Eigenschaften bestimmt die gültige Semantik statt Vererbung aus einer bestimmten Klasse oder Umsetzung eines spezifischen Schnittstelle.

Sie geben nicht explizit eine Schnittstelle an, von der Ihr Typ erben muss, um die Vorlage zu instanziieren.Es müssen lediglich alle Funktionen vorhanden sein, die in der Vorlagendefinition verwendet werden.Allerdings wird alles zur Kompilierungszeit aufgelöst und in rohe, undurchschaubare Hexadezimalzahlen kompiliert.Ich nenne das „Ententypisierung zur Kompilierungszeit“.Ich habe ganze Bibliotheken mit der Einstellung geschrieben, dass die implizite Template-Instanziierung ein Duck-Typing zur Kompilierzeit ist, und denke, dass es sich dabei um eine der am meisten unterschätzten Funktionen überhaupt handelt.

Andere Tipps

Strukturelles Typsystem

Ein Strukturtypsystem vergleicht einen Gesamttyp mit einem anderen Gesamttyp, um festzustellen, ob sie kompatibel sind.Für zwei Typen A Und B kompatibel sein, A Und B müssen die gleiche Struktur haben, d. h. jeden Methode auf A und weiter B muss die gleiche Signatur haben.

Ententippen

Beim Duck-Typing werden zwei Typen als gleichwertig betrachtet für die anstehende Aufgabe wenn beide diese Aufgabe bewältigen können.Für zwei Typen A Und B einem Codestück entsprechen, das in eine Datei schreiben möchte, A Und B beide müssen eine Schreibmethode implementieren.

Zusammenfassung

Strukturtypsysteme vergleichen jede Methodensignatur (gesamte Struktur).Duck-Typing vergleicht die Methoden, die für eine bestimmte Aufgabe relevant sind (für eine Aufgabe relevante Struktur).

Mittel zum Tippen von Enten Wenn es einfach passt, ist es in Ordnung

Dies gilt sowohl für dynamisch typisierte

def foo obj
    obj.quak()
end

oder statisch typisierte, kompilierte Sprachen

template <typename T>
void foo(T& obj) {
    obj.quak();
}

Der Punkt ist, dass in beiden Beispielen keine Angaben zum angegebenen Typ gemacht wurden.Erst bei der Verwendung (entweder zur Laufzeit oder zur Kompilierungszeit!) werden die Typen überprüft und wenn alle Anforderungen erfüllt sind, funktioniert der Code.Werte keinen expliziten Typ haben zum Zeitpunkt ihrer Erklärung.

Die strukturelle Typisierung basiert auf explizites Tippen Ihre Werte, wie immer – Der Unterschied besteht lediglich darin, dass der konkrete Typ nicht durch Vererbung, sondern durch seine Struktur identifiziert wird.

Ein strukturell typisierter Code (Scala-Stil) für das obige Beispiel wäre

def foo(obj : { def quak() : Unit }) {
    obj.quak()
}

Verwechseln Sie dies nicht mit der Tatsache, dass einige strukturell typisierte Sprachen wie OCaml dies mit Typinferenz kombinieren, um zu verhindern, dass wir die Typen explizit definieren.

Ich bin mir nicht sicher, ob es Ihre Frage wirklich beantwortet, aber ...

C++-Code mit Vorlagen ähnelt stark dem Duck-Typing, ist jedoch statisch, zur Kompilierzeit strukturell.

template<typename T>
struct Test
{
    void op(T& t)
    {
        t.set(t.get() + t.alpha() - t.omega(t, t.inverse()));
    }
};

Nach meinem Verständnis wird die strukturelle Typisierung von Typinferenzen und dergleichen verwendet, um Typinformationen zu ermitteln (denken Sie an Haskell oder OCaml), während sich Duck Typing nicht um „Typen“ per se kümmert, sondern nur darum, dass das Ding einen bestimmten Methodenaufruf verarbeiten kann. Grundstückszugang usw.(denken respond_to? in Ruby oder Fähigkeitsprüfung in Javascript).

Es wird immer Beispiele aus einigen Programmiersprachen geben, die gegen einige Definitionen verschiedener Begriffe verstoßen.ActionScript unterstützt beispielsweise die Programmierung im Duck-Typing-Stil für Instanzen, die technisch nicht dynamisch sind.

var x:Object = new SomeClass();
if ("begin" in x) {
    x.begin();
}

In diesem Fall haben wir getestet, ob die Objektinstanz in „x“ eine Methode „begin“ hat, bevor wir sie aufrufen, anstatt eine Schnittstelle zu verwenden.Dies funktioniert in ActionScript und ist im Grunde eine Art Duck-Typing, auch wenn die Klasse SomeClass() selbst möglicherweise nicht dynamisch ist.

Es gibt Situationen, in denen dynamisches Duck-Typing und ähnlicher statisch typisierter Code (z. B.C++) verhalten sich anders:

template <typename T>
void foo(T& obj) {
    if(obj.isAlive()) {
        obj.quak();
    }
}

In C++ muss das Objekt beides haben isAlive Und quak Methoden zum Kompilieren des Codes;Für den entsprechenden Code in dynamisch typisierten Sprachen muss das Objekt nur das haben quak Methode wenn isAlive() gibt true zurück.Ich interpretiere dies als einen Unterschied zwischen Struktur (Strukturtypisierung) und Verhalten (Ententypisierung).

(Ich gelangte jedoch zu dieser Interpretation, indem ich Wikipedias Aussage „Duck-Typing muss dynamisch sein“ für bare Münze nahm und versuchte, es sinnvoll zu gestalten.Die alternative Interpretation, dass implizite strukturelle Typisierung Ententypisierung ist, ist ebenfalls kohärent.)

Ich sehe „Duck Typing“ eher als einen Programmierstil, wohingegen „Structural Typing“ eine Funktion des Typsystems ist.

Strukturelle Typisierung bezieht sich auf die Fähigkeit des Typsystems äußern Typen, die alle Werte umfassen, die bestimmte strukturelle Eigenschaften haben.

Unter Duck-Typing versteht man das Schreiben von Code, der nur die Merkmale der übergebenen Werte verwendet, die tatsächlich für die jeweilige Aufgabe benötigt werden, ohne andere Einschränkungen aufzuerlegen.

So konnte ich verwenden Strukturtypen zum Codieren im Duck-Typing-Stil, indem ich meine „Duck-Typen“ offiziell als Strukturtypen deklariere.Ich könnte aber auch Strukturtypen verwenden ohne „Ententippen machen“.Wenn ich beispielsweise Schnittstellen zu einer Reihe verwandter Funktionen/Methoden/Prozeduren/Prädikate/Klassen/was auch immer schreibe, indem ich einen gemeinsamen Strukturtyp deklariere und benenne und diesen dann überall verwende, ist es sehr wahrscheinlich, dass einige der Codeeinheiten dies nicht benötigen alle der Merkmale des Strukturtyps, und so habe ich einige von ihnen unnötigerweise dazu gezwungen, Werte abzulehnen, mit denen sie theoretisch korrekt arbeiten könnten.

Obwohl ich also erkennen kann, dass es Gemeinsamkeiten gibt, glaube ich nicht, dass Duck-Typisierung strukturelle Typisierung einschließt.So wie ich darüber denke, ist Duck-Typing nicht einmal etwas, das strukturelles Typisieren hätte subsumieren können, weil es sich dabei nicht um dasselbe handelt.Wenn man Duck Typing in dynamischen Sprachen nur als „implizite, ungeprüfte Strukturtypen“ betrachtet, fehlt meiner Meinung nach etwas.Duck-Typing ist ein Codierungsstil, den Sie verwenden oder nicht verwenden möchten, und nicht nur eine technische Funktion einer Programmiersprache.

Es ist zum Beispiel möglich, zu verwenden isinstance Checkt Python ein, um Einschränkungen vom Typ „Klasse oder Unterklasse“ im OO-Stil zu fälschen.Es ist auch möglich, nach bestimmten Attributen und Methoden zu suchen, um Strukturtypbeschränkungen vorzutäuschen (Sie könnten die Prüfungen sogar in eine externe Funktion einfügen und so effektiv einen benannten Strukturtyp erhalten!).Ich würde behaupten, dass keine dieser Optionen beispielhaft für Duck-Typing ist (es sei denn, die Strukturtypen sind recht feinkörnig und werden eng mit der Codeprüfung für sie synchronisiert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top