Polimorfismo basato sul numero di argomenti?

2

Ho sentito che cambiare il comportamento di una funzione in base al tipo di argomento è chiamato polimorfismo ad hoc:

program Adhoc;

function Add(x, y : Integer) : Integer;
begin
    Add := x + y
end;

function Add(s, t : String) : String;
begin
    Add := Concat(s, t)
end;

begin
    Writeln(Add(1, 2));                   (* Prints "3"             *)
    Writeln(Add('Hello, ', 'World!'));    (* Prints "Hello, World!" *)
end.

Esiste un termine specifico per modificare il comportamento di una funzione in base al numero di argomenti passati ad esso?

es. la popolare libreria JavaScript jQuery ha molte funzioni che fanno cose diverse in base al numero di argomenti che vengono passati:

$(element).attr(attribute, value)  // sets element's attribute to value
$(element).attr(attribute)  // returns element's attribute

Questo è anche polimorfismo?

E ha un nome più specifico?

(Voglio usare questa parola per parlare di JS)

    
posta theonlygusti 11.01.2018 - 16:21
fonte

2 risposte

1

La domanda riguarda una lingua che supporta l'overloading (la prima) e un'altra che non lo supporta (JavaScript). Ciò renderà una risposta succinta più difficile.

JavaScript non fa sovraccarico. Non solo non sovraccarico ma non ha parametri digitati! Inoltre non esegue valori restituiti digitati! Una funzione può restituire nulla o qualcosa, in modo dinamico, come meglio ritiene opportuno. Non esiste praticamente alcuna gestione del tempo di compilazione del conteggio dei parametri, dei tipi di parametro e del tipo di ritorno.

(TypeScript e / o altro aggiunge sopra JavaScript, per ottenere i vantaggi di un sistema di tipi statici, in modo che gli errori di battitura possano essere rilevati in fase di compilazione anziché tramite debug.)

In JavaScript possiamo controllare dinamicamente il numero di parametri passati e / o controllare i tipi dinamici dei parametri, e / o vedere se è stato passato o meno un parametro opzionale. E possiamo cambiare il comportamento in un modo o nell'altro basandoci su quello.

the popular JavaScript library jQuery has many functions that do different things based on how many arguments they are passed

Questo meccanismo qui è parametri opzionali e valori di ritorno opzionali, ei programmatori stanno variando il comportamento in base alla presenza o assenza di parametri opzionali. Potremmo chiamarlo polimorfismo sciatto se abbiamo bisogno di un nome formale per questo. (Non sono necessariamente gli autori di jQuery a essere trascurati, ma questo linguaggio offre parametri opzionali e un valore di ritorno opzionale come un sostituto per l'overload.)

Questo non funzionerebbe in altri linguaggi: in generale funzioni devono restituire valori e procedure non possono (anche senza funzioni o metodi) - non possiamo cambiarlo dinamicamente. Poiché il valore di ritorno è stato digitato, non è possibile utilizzare un parametro facoltativo per modificare la natura del metodo (dalla funzione alla procedura).

Inoltre in altre lingue, i parametri facoltativi vengono passati come valore predefinito, che a volte non può essere distinto dal non essere stato passato.

Tuttavia, in alcuni di questi linguaggi è supportato il sovraccarico e quindi possono coesistere funzioni con lo stesso nome e conteggio o tipi diversi di parametri. Questi linguaggi tipicamente eseguono la selezione in fase di compilazione (binding) del sovraccarico appropriato da richiamare, che è chiamato polimorfismo ad-hoc. Penso che il nome sia un po 'troppo grande per quello che è solo un sovraccarico (in fase di compilazione); Qui non vedo il polimorfismo degli oggetti, solo due diverse funzioni che sono disponibili per la scelta al momento della compilazione.

Dobbiamo anche ricordare che alcune lingue supportano le Funzioni variabili (aka varargs), che consente una lista o una sequenza di ulteriori argomenti. Solitamente al massimo una tale lista di argomenti aggiuntivi è consentita e tale lista viene posizionata dopo ogni parametro regolare (non variabile). In genere, tutti i parametri in tale elenco varargs condividono alcune qualità comuni, quindi può essere considerato come un elenco di un certo tipo. Questa funzione non funziona necessariamente bene con i parametri opzionali.

    
risposta data 11.01.2018 - 19:00
fonte
0

Avere più funzioni, che variano in base al loro arbit (numero di parametri) o ai tipi di quei parametri, è in effetti un polimorfismo ad hoc ed è anche noto come sovraccarico di funzione / metodo.

Tuttavia, "cambiare il comportamento di una funzione in base al numero di argomenti passati ad esso" non è polimorfismo, in quanto hai solo una funzione e quella funzione sta cambiando il suo comportamento in base ai suoi parametri. Spesso è un odore di codice: avere una funzione fa più cose in base ai suoi parametri è generalmente disapprovato.

Tuttavia, con linguaggi dinamici, come JavaScript, che non supportano il polimorfismo ad hoc, l'uso dei parametri in questo modo è ampiamente riconosciuto come un modo accettabile di simulare l'overloading delle funzioni.

    
risposta data 11.01.2018 - 19:03
fonte

Leggi altre domande sui tag