Cambiare una variabile attraverso una serie di affermazioni ... Come si chiama questa tecnica?

0

Sto osservando una funzione che ha diverse istruzioni come questa:

n = returnDifferentVersionOf(n);

I.e, il valore di la stessa variabile n cambia progressivamente più volte durante il corso di una subroutine - piuttosto che una variabile appena nominata assegnata ad ogni cambiamento.

Qual è il nome generico di questa tecnica (se ce n'è una)?

Un esempio più completo potrebbe essere (in Ruby):

# reuse same var
def cromulentize(str="")
   str = "wowza" if str.empty?
   str += " adios!"
   str = str * 3
   str.gsub!('a', 'X')
   str = str[0..-3]
   str.upcase
end

Che cos'è questa tecnica chiamata, al contrario di questa:

# uses diff vars
def cromulentize(str="")
   non_empty_str = str.empty? ? "wowza" : str
   adios_str = non_empty_str += " adios!"
   multiplied_str = adios_str * 3
   gsubbed_str = multiplied_str.gsub!('a', 'X')
   spliced_str = gsubbed_str[0..-3]
   upcased_str = spliced_str.upcase
end

(Si noti che in Ruby il valore dell'ultima espressione di un metodo è il valore restituito.)

    
posta GladstoneKeep 28.08.2013 - 22:42
fonte

5 risposte

5

In alcuni casi, n potrebbe essere chiamato accumulator , o potresti dire che stai accumulando il risultato in n . Questo è particolarmente vero se n viene utilizzato per raccogliere il risultato di un numero di calcoli simili, come aggiungere un elenco:

n = 0;
n += foo.price;
n += bar.price;
n += baz.price;
n += qux.price;
print("The total is: %f", n);

accumulator è un vecchio termine informatico per una variabile (o in hardware, un registro) che memorizza i risultati per un ulteriore utilizzo. Puoi vedere come si applica il nome quando le operazioni sono tutte uguali, come sopra ... il valore in n si accumula nel modo in cui le foglie che cadono accumulano sul terreno. Ma penso che tu possa ancora usare il termine accumulator anche se le operazioni non sono tutte uguali, come nel tuo esempio.

    
risposta data 28.08.2013 - 22:52
fonte
3

A meno che non manchi qualcosa qui, la parola che stai cercando è quella che hai già: variabile.

In mathematics, a variable is a value that may change within the scope of a given problem or set of operations.

Con questa tecnica:

# uses diff vars
def cromulentize(str="")
    non_empty_str = str.empty? ? "wowza" : str
    adios_str = non_empty_str += " adios!"
    multiplied_str = adios_str * 3
    gsubbed_str = multiplied_str.gsub!('a', 'X')
    spliced_str = gsubbed_str[0..-3]
    upcased_str = spliced_str.upcase
end

Ciò che effettivamente hai è un gruppo di costanti dal momento che il loro valore è assegnato una volta e non è mai cambiato dopo.

    
risposta data 29.08.2013 - 14:54
fonte
0

Il nome più vicino che potresti veramente dare è "threading" (non nel senso di programmazione concorrente) o "compose" in un linguaggio imperativo ". Questo è esattamente il tipo di cosa che (ad esempio) Clojure risolve con il suo - > macro.

link

Richiede una serie di funzioni che dovrebbero essere eseguite in un ordine particolare e alimenta il risultato di ciascuna funzione alla funzione successiva nella sequenza. È possibile ottenere lo stesso effetto semplicemente annidando le chiamate di funzione, ma questo diventa brutto velocemente.

    
risposta data 29.08.2013 - 18:34
fonte
-1

ok, in risposta ai downvotes sul mio ragionamento, invio.

questo viene chiamato usando una variabile Temp

E

è cattivo

Mi piace decisamente il secondo frammento. Con i nuovi nomi variabili, so che cosa dovrebbe accadere invece di dover indovinare l'intenzione del codificatore originale. Questo rende più facile il codice refactoring di migliaia di volte, per aggiungere semplicemente due righe tra due linee esistenti o per creare un'intera funzione per quello che era un semplice compito o manipolazione da un accumulo o qualcosa del genere.

Gestire la complessità è fondamentale per il successo di qualsiasi programma non banale, e questa 'tecnica' di usare lo stesso nome di variabile non aiuta a gestire la complessità. Di fatto, sta peggiorando le cose, dal momento che il lettore di codice ha a che fare con una specie di variabile polimorfica multiuso.

L'unico caso in cui riesco a vedere questo è un po 'utile quando

  1. Lo scopo di questa variabile è molto breve e l'aggiunta di nomi dettagliati complicherebbe solo di più le cose. Ma attenzione, ciò che sembra semplice e di breve portata ora, può essere facilmente esteso nel tempo, ei programmatori non rinomineranno nulla e alla fine si finisce con un casino.

  2. A volte, quando si conosce il formato di uscita previsto di una variabile alla fine di una funzione, è POSSIBILE utilizzare quella variabile in quanto è un'area di attesa temporanea per alcune manipolazioni relativamente accidentali e l'intero ambito della variabile rimane piccolo. Ma anche questo, SO, SO, SO molte volte, quando provo a ridisegnare e reimpostare il codice in questo modo, avrei preferito che il codificatore originale spendesse il doppio delle linee e il doppio delle variabili, solo per mostrarmi esattamente , nel spiegando il livello di dettaglio di 6 anni, che cosa dovrebbe succedere . Non credenti, accendi il fuoco.

risposta data 29.08.2013 - 14:34
fonte
-2

Lo chiamerei un casino. Nessuna di queste modifiche è correlata, né in causa né in effetto. Fare tutti quei controlli e modifiche in un posto nel tuo codice è inutile. Se questa stringa è una proprietà significativa di un oggetto dominio, dovrebbero esserci metodi significativi e distinti che la cambiano, ogni cambiamento essendo separato. A meno che tu non possa fornire prove migliori per mostrare il contrario.

Questo è un codice spazzatura.

Modifica: come spero sia chiaro dalla discussione nei commenti, questo non è uno scavo a mtoast.

    
risposta data 29.08.2013 - 00:20
fonte

Leggi altre domande sui tag