Was bedeutet _Duckmäusertippen_ in der Softwareentwicklung bedeuten?
Antworten
Zu viele Anzeigen?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.
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.
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:
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
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:
- 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 nurBird
s. - Meine Funktion erhält jede
objects
und ich rufe einfach das Objektwalk()
Methode. Wenn also dieobject
kannwalk()
dann ist es richtig. Wenn das nicht der Fall ist, schlägt meine Funktion fehl. Hier ist es also nicht wichtig, ob das Objekt einBird
oder irgendetwas anderes, ist es wichtig, dass eswalk()
(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
- Es gibt gute Beispiele für Duckmäusertippen für Java, Python, JavaScript usw. unter https://en.wikipedia.org/wiki/Duck_typing .
- Auch hier gibt es eine gute Antwort, die die Vorteile von dynamisch Eingabe von und auch seine Nachteile: Worin besteht der angebliche Produktivitätsgewinn der dynamischen Typisierung?
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. .
- See previous answers
- Weitere Antworten anzeigen