Ecco un problema di programmazione / lingua su cui mi piacerebbe sentire le tue opinioni.
Abbiamo sviluppato convenzioni che la maggior parte dei programmatori (dovrebbe) seguire non fanno parte della sintassi dei linguaggi ma servono a rendere il codice più leggibile. Questi sono sempre una questione di dibattito, ma ci sono almeno alcuni concetti chiave che la maggior parte dei programmatori trovano gradevoli. Assegnare nomi alle variabili in modo appropriato, nominare in generale, rendere le linee non scandalosamente lunghe, evitare lunghe funzioni, incapsulamenti, quelle cose.
Tuttavia, c'è un problema che devo ancora trovare qualcuno che commenta e che potrebbe essere il più grande del gruppo. È il problema degli argomenti che sono anonimi quando chiami una funzione.
Le funzioni derivano dalla matematica in cui f (x) ha un significato chiaro perché una funzione ha una definizione molto più rigorosa che solitamente fa nella programmazione. Le funzioni pure in matematica possono fare molto meno di quanto possano fare nella programmazione e sono uno strumento molto più elegante, di solito prendono solo un argomento (che di solito è un numero) e restituiscono sempre un valore (anche di solito un numero). Se una funzione accetta più argomenti, sono quasi sempre solo dimensioni extra del dominio della funzione. In altre parole, un argomento non è più importante degli altri. Sono esplicitamente ordinati, certo, ma a parte questo, non hanno ordini semantici.
In programmazione, tuttavia, abbiamo più libertà nella definizione delle funzioni, e in questo caso direi che non è una buona cosa. Una situazione comune, hai una funzione definita in questo modo
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Guardando la definizione, se la funzione è scritta correttamente, è perfettamente chiaro cosa è cosa. Quando si chiama la funzione, si potrebbe anche avere un po 'di magia di completamento del codice / intellectense in corso nel tuo IDE / editor che ti dirà quale dovrebbe essere il prossimo argomento. Ma aspetta. Se ho bisogno di questo quando sto effettivamente scrivendo la chiamata, non c'è qualcosa che ci manca qui? La persona che legge il codice non ha il vantaggio di un IDE e, a meno che non salti alla definizione, non ha idea di quale dei due rettangoli sia passato come argomento per cosa.
Il problema va anche oltre. Se i nostri argomenti provengono da alcune variabili locali, potrebbero esserci situazioni in cui non sappiamo nemmeno quale sia il secondo argomento poiché vediamo solo il nome della variabile. Prendi ad esempio questa riga di codice
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Questo problema viene alleviato in varie lingue in diverse lingue, ma anche in lingue tipizzate rigorosamente e anche se le tue variabili sono nominate in modo sensibile, non menzioni nemmeno il tipo di variabile quando lo passi alla funzione.
Come di solito accade con la programmazione, ci sono molte potenziali soluzioni a questo problema. Molti sono già implementati nelle lingue popolari. Ad esempio, i parametri denominati in C #. Tuttavia, tutto ciò che so ha degli svantaggi significativi. Assegnare un nome a ogni parametro su ogni chiamata di funzione non può portare a un codice leggibile. Sembra quasi che stiamo superando le possibilità offerte da una semplice programmazione di testo. Ci siamo spostati dal testo JUST in quasi tutte le aree, ma continuiamo a codificare lo stesso. Ulteriori informazioni sono necessarie per essere visualizzate nel codice? Aggiungi altro testo. Ad ogni modo, questo sta diventando un po 'tangenziale quindi mi fermerò qui.
Una risposta che ho ottenuto con il secondo frammento di codice è che probabilmente dovresti prima decomprimere l'array con alcune variabili nominate e poi usarle, ma il nome della variabile può significare molte cose e il modo in cui viene chiamato non indica necessariamente il modo in cui dovrebbe essere interpretato nel contesto della funzione chiamata. Nell'ambito locale, potresti avere due rettangoli di nome leftRectangle e rightRectangle perché è ciò che rappresentano semanticamente, ma non è necessario estenderli a ciò che rappresentano quando vengono assegnati a una funzione.
In effetti, se le variabili sono denominate nel contesto della funzione chiamata di quella che stai introducendo meno informazioni di quelle che potresti potenzialmente con quella chiamata di funzione e a un certo livello se portano a codice codice peggiore. Se si dispone di una procedura che si traduce in un rettangolo archiviato in rectForClipping e quindi in un'altra procedura che fornisce rectForDrawing, la chiamata effettiva a DrawRectangleClipped è solo una cerimonia. Una linea che non significa nulla di nuovo ed è lì solo così il computer sa esattamente cosa vuoi, anche se lo hai già spiegato con la tua denominazione. Questa non è una buona cosa.
Mi piacerebbe davvero sentire nuove prospettive su questo. Sono sicuro di non essere il primo a considerare questo problema, quindi come si risolve?