La funzione restituisce solo parametri invariati, inutili?

15

Ho appena trovato questa funzione nel progetto a cui sto lavorando:

  -- Just returns the text unchanged.
  -- Note: <text> may be nil, function must return nil in that case!
  function Widget:wtr(text)
      return text
  end

Troppo triste, il programmatore non funziona più in azienda. Perché si dovrebbe fare una funzione che non fa nulla, ma restituisce il parametro con cui è chiamato?

C'è qualche utilità per una funzione del genere, non specificata in questo esempio, ma nel complesso in ogni caso?

dovuto a

function aFunction(parameter)
    return parameter
end

Termina in

aFunction(parameter) == parameter

Perché dovrei scrivere qualcosa di simile

aFunction(parameter) == whatIWantToCheck

invece di

parameter == whatIWantToCheck

    
posta Sempie 12.09.2014 - 11:19
fonte

7 risposte

57

La tua domanda è come chiedere qual è il valore del numero zero se ogni volta che lo aggiungi a qualcosa ottieni lo stesso valore. Una funzione di identità è come lo zero per le funzioni. Un po 'inutile da solo, ma occasionalmente utile come parte di un'espressione che utilizza le funzioni di ordine superiore, dove puoi prendere una funzione come parametro o restituirla come risultato. Ecco perché molti linguaggi di programmazione funzionale hanno una id o identity nella loro libreria standard.

In altre parole, è una comoda funzione predefinita. Proprio come potresti voler impostare offset = 0 come numero intero predefinito, anche se ciò fa sì che un offset non faccia nulla, potrebbe tornare utile poter impostare filterFunction = identity come funzione predefinita, anche se ciò fa sì che il filtro non faccia nulla .

    
risposta data 12.09.2014 - 15:02
fonte
27

Certo. Immagina un'API esterna che ti permetta di recuperare le cose da qualche parte di cui hai assolutamente bisogno, ma devi specificare i criteri di filtro e i formattatori di output per ogni query, anche se vuoi tutti i risultati e vuoi ottenerli esattamente come memorizzato.

Quindi dovresti inventare un banale "accettare tutto" e una banale funzione "return immutato" per ottenere i dati. wtr è precisamente un banale pseudo-formattatore. Se si utilizza molto quell'API, può essere molto utile avere questa funzione di pseudo-helper in giro piuttosto che dover creare una funzione anonima ogni volta che si interroga qualcosa. (Potresti considerare di chiamarlo identity piuttosto che wtr in modo che sia immediatamente chiaro che non fa nulla.)

    
risposta data 12.09.2014 - 11:22
fonte
15

Non è solo un polimorfismo?

Dalla mia esperienza con i metodi Qt tr() e wtr() dovrebbero essere utilizzati (lì, in Qt ) nella localizzazione del testo di Widget .

Quindi, restituendo il testo invariato, questo metodo dice semplicemente: Widget does no localization (translation of the text) by default. Override this function to enable your own logic .

    
risposta data 13.09.2014 - 10:34
fonte
8

Un caso molto comune per questo è "funzionalità aggiunta in seguito". Quindi il programmatore pensava che ci sarebbe stato qualche cambiamento in quella funzione in seguito. Dal momento che accedete come una funzione e non come il parametro stesso, potete facilmente modificarla a livello globale. Diciamo che hai un indice con:

function getIndex(index)
    return index
end

e dal momento che l'indice inizia da 0 questo va tutto bene. In seguito cambi un componente da qualche altra parte, questo componente ha bisogno di tradurre il tuo indice per iniziare a 1. Dovresti aggiungere centinaia di indice + 1 in tutto il codice. Ma con un metodo come questo, dì semplicemente:

 function getIndex(index)
    return index+1
end

e stai bene. Funzioni come questa possono portare rapidamente alla sovraingegneria, ma in alcuni punti hanno molto senso!

    
risposta data 12.09.2014 - 20:07
fonte
6

Le funzioni di stub come questa sono comuni nelle situazioni di ereditarietà del tipo. La classe base potrebbe non fare nulla di utile, ma le classi derivate potrebbero fare varie cose con gli input. Dichiarare la funzione stub nella classe base consente a tutte le classi derivate di avere una funzione di quel nome, e le singole classi derivate a sovrascrivere con qualcosa di più elaborato e utile.

    
risposta data 12.09.2014 - 20:35
fonte
5

Uno scenario aggiuntivo è simile all'utilizzo in Python e C # delle proprietà, ma in lingue che non hanno la funzione.

In generale, puoi dichiarare qualcosa solo come membro della classe; diciamo 'nome' come stringa. Ciò significa che accedici in questo modo:

someobject.name

In seguito, decidi che il nome deve davvero dipendere da cosa c'è nell'oggetto. Quindi dovrebbe essere davvero una funzione. Oops! Anche senza argomenti, significa che tutto il codice che lo accede ora deve essere cambiato in

someobject.name()

Ma se hai molte istanze di questa chiamata, le probabilità che non ci sia nulla di sbagliato in questo sono piuttosto basse - da qualche parte questa modifica non verrà effettuata, il programma si bloccherà quando arriverai a quel punto, ecc.

Proprietà in C # / Python ti permettono di sostituire una funzione in quello che era un attributo, pur continuando a permetterne l'accesso come un attributo, cioè senza modifiche. Non devi nemmeno aver pianificato in anticipo.

Se il tuo linguaggio non ha questo, devi pianificare in anticipo, ma puoi ancora supportarlo come facevano le persone prima facendone una funzione dall'inizio che non fa nulla. All'inizio, non farà nulla di interessante, e sembra che dovrebbe essere rimosso, e molte funzioni di questo tipo non vengono mai cambiate. Ma più tardi, se ti rendi conto che in realtà ogni volta che chiami Widget.wtr devi rimuovere alcuni caratteri speciali, non è un grosso problema - è già una funzione, basta aggiungerla e il gioco è fatto.

TL; DR Questo potrebbe essere solo un programmatore saggio che pianifica in anticipo le modifiche future.

    
risposta data 12.09.2014 - 18:51
fonte
2

Non è inutile, in realtà può essere estremamente utile, perché rende il tuo codice più uniforme e flessibile.

Supponiamo, ad esempio, di avere un elenco di persone e un menu a discesa per l'utente per selezionare se vogliamo vedere "tutti" o solo quelli che sono "maschili" o "femminili".

Puoi gestire "tutti" come caso speciale, nel qual caso avrai bisogno di un extra se e di controllare esplicitamente questo caso, oppure puoi avere una funzione filtro che restituisce solo il suo parametro (ad esempio, consente di tutto pass), assegnato per essere utilizzato per il caso "all".

    
risposta data 12.09.2014 - 15:37
fonte

Leggi altre domande sui tag