L'anatra sta scrivendo un sottoinsieme di polimorfismo


17

Dal polimorfismo su Wikipedia

Nell'informatica, il polimorfismo è una funzione del linguaggio di programmazione che consente di gestire valori di diversi tipi di dati utilizzando un'interfaccia uniforme.

Dall'anatra digitando su Wikipedia

Nella programmazione al computer con linguaggi di programmazione orientati agli oggetti, la tipizzazione duck è uno stile di tipizzazione dinamica in cui l'insieme attuale di metodi e proprietà di un oggetto determina la semantica valida, piuttosto che la sua eredità da una particolare classe o implementazione di una specifica interfaccia.

La mia interpretazione è che in base alla tipizzazione anatra, i metodi / proprietà degli oggetti determinano la semantica valida. Ciò significa che la forma corrente degli oggetti determina l'interfaccia che sostiene.

Dal polimorfismo si può dire che una funzione è polimorfica se accetta più tipi di dati diversi purché mantengano un'interfaccia.

Pertanto, se una funzione può evitare il tipo, può accettare più tipi di dati diversi e operare su di essi purché tali tipi di dati abbiano i metodi / proprietà corretti e quindi mantengano l'interfaccia.

(L'uso del termine interfaccia non è inteso come un costrutto di codice ma piuttosto come un costrutto descrittivo e documentativo)

  • Qual è la relazione corretta tra ducktyping e polimorfismo?
  • Se una lingua può evitare il tipo, significa che può fare il polimorfismo?

1
Non sono sicuro di cosa stai cercando in una risposta. Hai definito entrambi con precisione, quindi hai una risposta definitiva. Decidere se scrivere l'anatra "conta" come polimorfismo è più o meno una domanda filosofica, o forse una domanda terminologica se lo intendi in questo modo. Cosa vorresti cercare in una risposta?
psr

@psr Stavo praticamente dicendo "Ecco come lo interpreto. Sbaglio? Ho ragione? Ci sono persone accademiche affidabili che lo dicono in un modo o nell'altro. Ci sono articoli sull'argomento?" Fondamentalmente in dettaglio altro che "la tipizzazione delle anatre è un'implementazione / un sottoinsieme del polimorfismo" cos'altro si può dire sulla relazione?
Raynos,

per quanto ho capito, l' omografia rende anatra la digitazione di qualcos'altro se non un'interfaccia uniforme => non un polimorfismo, o almeno non nel senso di come Wikipedia lo definisce. Per esempio door.close()etiger.close()
moscerino il

4
La tipizzazione dell'anatra è un caso di polimorfismo ad hoc . Ci stai pensando troppo.
yannis,

Risposte:


16

Dico che il polimorfismo è un tratto generico, che può essere implementato in diversi modi:

  • eredità basata sulla classe.
  • oggetti basati su prototipi (con o senza eredità)
  • digitando anatra
  • conformità delle interfacce (come fatto dalle interfacce di Go e implicitamente sui modelli C ++)

ognuna di esse consente al programmatore di utilizzare un singolo codice con tipi diversi, quindi tutti incarnano il concetto di polimorfismo.


7

Penso che:

Sia la tipizzazione delle anatre che il polimorfismo sono mezzi di indiretta / astrazione. Il polimorfismo è un concetto fondato sui tipi e sulla tipizzazione mentre la tipizzazione delle anatre si basa sui contratti.

Con il polimorfismo è importante ciò che la COSA è e non come si comporta (il suo comportamento può essere la conseguenza di ciò che è).

Nel digitare l'anatra è importante come si comporta una COSA. La tipizzazione delle anatre è più legata al concetto di oggetti come attori che scambiano messaggi, piuttosto che oggetti che hanno alcune proprietà definite.


2
Questo è sbagliato. Il polimorfismo è un enorme ombrello che copre molte cose. In particolare, copre la tipizzazione delle anatre. Quindi la tipizzazione delle anatre è una forma di polimorfismo.
Thomas Eding,

Non sono d'accordo. L'eredità tradizionale con metodi comportamentali ha gli stessi tratti. E 'solo più type-safe per essere esplicito su ciò che il comportamento di un oggetto è garantito per mostra (che non esclude altri comportamenti!)
marstato

6

La risposta è .

Duck Typing è un caso speciale di tipizzazione dinamica e anche se la tipizzazione dinamica di per sé non può essere considerata direttamente come polimorfismo (poiché è solo la proprietà del linguaggio eseguire il controllo del tipo in fase di esecuzione piuttosto che in fase di compilazione), le tecniche che di solito alla base della tipizzazione dinamica, tale associazione tardiva e spedizione dinamica sono caratteristiche del polimorfismo .


Il problema con l'articolo di Wikipedia e quante persone usano il termine al giorno d'oggi è che non definisce il significato della tipizzazione anatra quando l'ho visto per la prima volta (vale a dire, una forma di digitazione) ma piuttosto, essere in grado di invocare metodi e lanciare un errore di runtime quando non sono definiti. Non si tratta di digitare ma piuttosto della mancanza di digitazione, come spiega Eric Lippert .
reinierpost,

1

La tipizzazione delle anatre non è proprio un sottoinsieme del polimorfismo, poiché il polimorfismo richiede esplicitazione, che si perde nella tipizzazione delle anatre. Quindi la tipizzazione duck ha la possibilità di "implementare" una "interfaccia" non perché abbia un senso semantico ma perché hai la stessa firma. Se la tipizzazione delle anatre fosse un sottoinsieme del polimorfismo, avrebbe tutte le proprietà del polimorfismo, inclusa la dichiarazione esplicita.

Anche la tipizzazione delle anatre non è in realtà un'implementazione del polimorfismo, fa parte di un sistema di tipi diversi. Di solito associ la tipizzazione duck a un linguaggio dinamico che procede e trasmette un messaggio a un oggetto senza sapere se l'oggetto è in grado di gestirlo - in tal caso ha effettivamente superato il test di tipizzazione duck. Di solito si pensa al polimorfismo come implementato in fase di compilazione impostando vtables (e utilizzabile se le interfacce sono diverse dalle classi). Ma ci sono MOLTE lingue disponibili e molti modi per implementare queste funzionalità.

In una certa misura questa è una domanda filosofica. Riesci a pensare alla tipizzazione duck come interfacce che vengono automaticamente dichiarate implicitamente? Non riesco a pensare a nessuna ragione che sia sbagliata , esattamente, ma non penso che sia probabilmente il modo più produttivo per vederlo. Penso che la tipizzazione e le interfacce delle anatre siano entrambe caratteristiche comunemente riscontrate nei sistemi di tipi di linguaggio di programmazione, entrambe hanno modi di comportamento abbastanza simili, ed entrambi sono importanti per i programmatori.


6
"il polimorfismo richiede esplicitazione" dove lo dice? l'eredità di classe è solo una forma di polimorfismo, non l'unica.
Javier,

E continuando il commento di @ Javier, che ne dici del polimorfismo ad hoc ?
yannis,

@YannisRizos - Il problema nel rispondere a qualsiasi domanda come questa è che ci sono così tante lingue e così tante terminologie che qualcuno potrebbe puntualizzarti indipendentemente da quello che dici. Capisco perché "polimorfismo ad hoc" abbia la parola "polimorfismo" nel nome, ma direi che è qualcos'altro rispetto a ciò che l'OP intende con "polimorfismo".
psr

@Javier - Tutti i metodi che hai elencato richiedono esplicito tranne la tipizzazione anatra.
psr

@psr In realtà non mi interessa cosa significasse OP con "polimorfismo". Non credo che a nessuno dovrebbe interessare, è un concetto scientifico con una definizione molto semplice, non credo che dovremmo rispondere sulla base delle nostre interpretazioni o di ciò che potremmo pensare sia l'interpretazione dei PO. Soprattutto l'interpretazione dei PO, dal momento che lo chiede per impostazione predefinita non è sicuro della sua interpretazione. Non sono d'accordo sul fatto che si tratti di una questione filosofica, la domanda, come affermato, era scientifica con una semplice risposta: sì, il ducktyping è una forma di polimorfismo ad hoc, un sottoinsieme di polimorfismo.
yannis,

1

È quasi naturale dire "Sì, se il foo ha una battuta d'anatra, il foo ha un polimorfismo". Ma non posso dirlo sicuro al 100%, nel senso che forse è possibile trovare un esempio artificiale di tale sistema che ha la tipizzazione anatra ("può ciarlare && può galleggiare sull'acqua ==> è un Duck ") pur non avendo il polimorfismo (" foo, quack! "Non riesce), ma sarebbero davvero artificiali e in un mondo reale, direi" Sì, se è presente la tipizzazione delle anatre, deve essere presente anche il polimorfismo ".

Personalmente vedo la battuta delle anatre come "polimorfismo fatto bene". Ciò che intendo con ciò, ciò che esiste in un mondo di tipizzazione di anatre non ha bisogno di avere tipi espliciti e il loro comportamento (polimorfico = "stesso accesso, esito diverso") è l'unica cosa che conta. In altre implementazioni del polimorfismo, è vincolato a tipi / interfacce / ereditarietà, quindi è "polimorfismo implementato e vincolato" non un "polimorfismo in sé".


0

I linguaggi di programmazione tipizzati staticamente consentono un controllo degli errori precedente, una migliore applicazione di stili di programmazione disciplinati e la generazione di un codice oggetto più efficiente rispetto ai linguaggi in cui tutti i controlli di coerenza dei tipi vengono eseguiti in fase di esecuzione.

(B. Pierce e amici)

Quindi, come puoi notare, a questo proposito, la tipizzazione di anatre è una digitazione dinamica che funziona davvero diversamente da queste.

Esiste un metodo per determinare il tipo relativo al polimorfismo, ad esempio, che rende il codice più flessibile, ma la tipizzazione anatra è un altro problema in questi casi.

In dettaglio c'è il calcolo lambda tipizzato e il calcolo lambda non tipizzato che aiutano a determinare la proprietà del calcolo e di un calcolo.

Vedo anche che cose come la tipizzazione anatra possono aiutare se vogliamo solo ottenere un risultato veloce, ma in altre occasioni sento anche che la natura dinamica lo rende più adattabile alle esigenze, quindi posso calcolare più velocemente. Immagino sia solo per dire, cara, che se so già cosa voglio già calcolare, digitare è il migliore, ma perché so cosa voglio? Hehehe ...

Sono i miei cinque centesimi e immagino che possa fare un argomento di ricerca interessante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.