589 Stimmen

Was ist das Tippen von Enten?

Was bedeutet _Duckmäusertippen_ in der Softwareentwicklung bedeuten?

396voto

Oded Punkte 475566

Dieser Begriff wird verwendet in dynamische Sprachen die nicht über starke Typisierung .

Die Idee dahinter ist, dass man keinen Typ braucht, um eine vorhandene Methode auf einem Objekt aufzurufen - wenn eine Methode auf dem Objekt definiert ist, kann man sie aufrufen.

Der Name stammt von dem Satz "Wenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente".

Wikipedia hat viel mehr Informationen.

260voto

Dario Punkte 47246

Ente tippen bedeutet, dass eine Operation nicht nicht förmlich festlegen die Anforderungen, die seine Operanden erfüllen müssen, sondern nur probiert es aus mit dem, was gegeben ist.

Im Gegensatz zu dem, was andere gesagt haben, bezieht sich dies nicht unbedingt auf dynamische Sprachen oder Vererbungsfragen.

Beispielhafte Aufgabe: Aufruf einer Methode Quack auf ein Objekt.

Ohne mit Duck-Typing, eine Funktion f die diese Aufgabe übernimmt, muss im Voraus festlegen, dass ihr Argument eine Methode unterstützen muss Quack . Eine gängige Methode ist die Verwendung von Schnittstellen

interface IQuack { 
    void Quack();
}

void f(IQuack x) { 
    x.Quack(); 
}

Aufruf von f(42) scheitert, aber f(donald) funktioniert, solange donald ist ein Beispiel für eine IQuack -Subtyp.

Ein anderer Ansatz ist strukturelle Typisierung - aber auch hier gilt, dass die Methode Quack() ist alles formal spezifiziert, was es nicht beweisen kann quack s im Voraus zu kompilieren, führt zu einem Compilerfehler.

def f(x : { def Quack() : Unit }) = x.Quack() 

Wir könnten sogar schreiben

f :: Quackable a => a -> IO ()
f = quack

in Haskell, wo die Quackable Typklasse gewährleistet die Existenz unserer Methode.


Wie ändert sich dies durch **Duck typing**?

Nun, wie gesagt, ein Enten-Typisierungssystem spezifiziert keine Anforderungen, sondern versucht einfach, ob etwas funktioniert .

Ein dynamisches Typsystem wie das von Python verwendet daher immer die Duck-Typisierung:

def f(x):
    x.Quack()

Si f erhält eine x Unterstützung einer Quack() ist alles in Ordnung, wenn nicht, stürzt es zur Laufzeit ab.

Aber die Duck-Typisierung impliziert keineswegs eine dynamische Typisierung - tatsächlich gibt es einen sehr populären, aber völlig statischen Duck-Typisierungsansatz, der ebenfalls keine Anforderungen stellt:

template <typename T>
void f(T x) { x.Quack(); } 

Die Funktion sagt in keiner Weise, dass sie etwas x das kann Quack und versucht stattdessen einfach zur Kompilierzeit und wenn alles funktioniert, ist es in Ordnung.

199voto

BenKoshy Punkte 29349

Einfache Erläuterung

Was ist das Tippen von Enten?

"Wenn es läuft wie eine Ente und quakt wie eine .... usw." - JA, aber was soll das bedeuten?!

Wir sind daran interessiert, was "Objekte" tun können, und nicht, was sie sind.

Lassen Sie uns dies anhand eines Beispiels erläutern:

Explanation of Duck Typing

Für weitere Einzelheiten siehe unten:

Beispiele für die Funktionalität von Duck Typing:

Stellen Sie sich vor, ich hätte einen Zauberstab. Er hat besondere Kräfte. Wenn ich den Zauberstab schwenke und sage "Fahr!" zu einem Auto, na dann fährt es!

Funktioniert es auch bei anderen Dingen? Ich bin mir nicht sicher: also probiere ich es an einem Lastwagen aus. Wow - er fährt auch! Dann probiere ich es mit Flugzeugen, Zügen und 1 Woods (das ist eine Art Golfschläger, mit dem man einen Golfball "fährt"). Sie fahren alle!

Aber würde es auch mit einer Teetasse funktionieren? Fehler: KAAAA-BOOOOOOM! Das hat nicht so gut geklappt. ====> Teetassen können nicht fahren!

Dies ist im Grunde das Konzept der Enten-Typisierung. Es ist eine Testen Sie, bevor Sie kaufen System. Wenn es funktioniert, ist alles gut. Aber wenn es versagt, wie eine Granate, die man noch in der Hand hat, wird es einem um die Ohren fliegen.

Mit anderen Worten, wir sind daran interessiert, was das Objekt kann tun und nicht mit was das Objekt ist .

Was ist mit Sprachen wie C# oder Java usw.?

Wenn wir uns mit folgenden Fragen beschäftigen würden was das Objekt tatsächlich war dann funktioniert unser Zaubertrick nur bei voreingestellten, zugelassenen Typen - in diesem Fall Autos, aber wird bei anderen Objekten fehlschlagen, die die Lastwagen, Mopeds, Tuk-Tuks usw. Es wird nicht auf Lastwagen funktionieren, weil unser Zauberstab erwartet, dass es nur an Autos arbeiten .

Mit anderen Worten, in diesem Szenario schaut sich der Zauberstab sehr genau an, was das Objekt es (ist es ein Auto?) und nicht, was das Objekt kann tun (z. B. ob Autos, Lastwagen usw. fahren können).

Die einzige Möglichkeit, einen Lkw zum Fahren zu bringen, besteht darin, beide Lkw mit einem Zauberstab zu erwarten. y Autos (vielleicht durch "Implementierung einer gemeinsamen Schnittstelle"). Wenn Sie nicht wissen, was das bedeutet, lesen Sie meine Cartoon über Schnittstellen .

Zusammenfassung: Schlüssel zum Erfolg

Wichtig bei der Typisierung von Enten ist was das Objekt tatsächlich kann tun, und nicht das, was das Objekt es .

Prolog

Ich habe versucht, es einfach zu halten und auf pedantische Nuancen zu verzichten.

Wenn Sie eine genauere Definition wünschen, lesen Sie die wikipedia-Artikel zum Tippen ducken oder Matt Damons Erklärung, sich bei der Eingabe zu ducken Good Will Hunting

47voto

Alireza Fattahi Punkte 37703

Nehmen wir an, Sie entwerfen eine einfache Funktion, die ein Objekt vom Typ Bird und ruft seine walk() Methode. Es gibt zwei Ansätze, die Sie sich vorstellen können:

  1. Dies ist meine Funktion, und ich muss sicher sein, dass sie nur die Bird Typ, sonst lässt sich der Code nicht kompilieren. Wenn jemand meine Funktion verwenden möchte, muss er sich bewusst sein, dass ich nur Bird s.
  2. Meine Funktion erhält jede objects und ich rufe einfach das Objekt walk() Methode. Wenn also die object kann walk() dann ist es richtig. Wenn das nicht der Fall ist, schlägt meine Funktion fehl. Hier ist es also nicht wichtig, ob das Objekt ein Bird oder irgendetwas anderes, ist es wichtig, dass es walk() (Dies ist Duckmäusertippen ).

Es muss berücksichtigt werden, dass Duckmäusertippen kann in einigen Fällen nützlich sein. Python verwendet zum Beispiel Duckmäusertippen eine Menge.


Nützliche Lektüre

32voto

Gerard Simpson Punkte 1887

Ich sehe viele Antworten, die die alte Redewendung wiederholen:

Wenn es wie eine Ente aussieht und wie eine Ente quakt, ist es eine Ente

und tauchen dann in eine Erklärung dessen ein, was man mit der Enten-Typisierung machen kann, oder in ein Beispiel, das das Konzept noch weiter zu verwirren scheint.

Ich finde das nicht sehr hilfreich.

Dies ist der beste Versuch einer einfachen englischen Antwort über das Tippen von Enten, den ich gefunden habe:

Duck Typing bedeutet, dass ein Objekt dadurch definiert ist, was es tun kann, nicht durch was es ist.

Das bedeutet, dass wir uns weniger mit der Klasse/dem Typ eines Objekts befassen, sondern mehr damit, welche Methoden auf ihm aufgerufen und welche Operationen mit ihm durchgeführt werden können. Wir interessieren uns nicht für die Art, sondern dafür, was es kann. .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X