Ecco un problema di programmazione / linguaggio su cui vorrei sentire le tue opinioni.
Abbiamo sviluppato convenzioni che la maggior parte dei programmatori (dovrebbero) seguire e che non fanno parte della sintassi delle lingue ma servono a rendere il codice più leggibile. Questi sono ovviamente sempre oggetto di dibattito, ma ci sono almeno alcuni concetti chiave che la maggior parte dei programmatori trova gradevoli. Denominare le variabili in modo appropriato, denominare in generale, rendere le linee non eccessivamente lunghe, evitando 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 dove f (x) ha un chiaro significato perché una funzione ha una definizione molto più rigorosa di quella che di solito fa in programmazione. Le funzioni pure in matematica possono fare molto meno di quanto possano fare in 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 un ordine semantico.
Nella programmazione tuttavia, abbiamo più funzioni di definizione della libertà, e in questo caso direi che non è una buona cosa. Una situazione comune, hai una funzione definita come questa
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Guardando la definizione, se la funzione è scritta correttamente, è perfettamente chiaro che cosa. Quando chiami la funzione, potresti anche avere un po 'di magia di completamento di intellisense / codice in corso nel tuo IDE / editor che ti dirà quale dovrebbe essere il prossimo argomento. Ma aspetta. Se ne ho bisogno quando scrivo davvero 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 passati come argomenti viene utilizzato 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 è alleviato in varia misura in diverse lingue ma anche in linguaggi tipicamente rigorosi e anche se si nominano le variabili in modo sensibile, non si menziona nemmeno il tipo di variabile quando si passa alla funzione.
Come di solito accade con la programmazione, ci sono molte potenziali soluzioni a questo problema. Molti sono già implementati in lingue popolari. Parametri nominati in C # per esempio. Tuttavia, tutto ciò che conosco presenta degli svantaggi significativi. La denominazione di ogni parametro su ogni chiamata di funzione non può portare a codice leggibile. Sembra quasi che stiamo superando le possibilità che ci offre la programmazione in testo semplice. Siamo passati dal testo SOLO in quasi tutte le aree, eppure continuiamo a scrivere lo stesso codice. Ulteriori informazioni sono necessarie per essere visualizzate nel codice? Aggiungi altro testo. Comunque, questo sta diventando un po 'tangenziale, quindi mi fermo qui.
Una risposta che ho ricevuto al secondo frammento di codice è che probabilmente prima dovresti decomprimere l'array in alcune variabili con nome e poi utilizzarle, ma il nome della variabile può significare molte cose e il modo in cui viene chiamato non ti dice necessariamente come dovrebbe essere interpretato nel contesto della funzione chiamata. Nell'ambito locale, potresti avere due rettangoli chiamati leftRectangle e rightRectangle perché è quello che rappresentano semanticamente, ma non è necessario estenderlo a ciò che rappresentano quando viene assegnato a una funzione.
In effetti, se le variabili sono nominate nel contesto della funzione chiamata di quanto stai introducendo meno informazioni di quelle che potresti potenzialmente con quella chiamata di funzione e ad un certo livello se portano a un codice peggiore del codice. Se si dispone di una procedura che risulta in un rettangolo memorizzato 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 per far sì che il computer sappia esattamente cosa vuoi, anche se l'hai già spiegato con il tuo nome. Questa non è una buona cosa.
Mi piacerebbe davvero sentire nuove prospettive su questo. Sono sicuro di non essere il primo a considerare questo un problema, quindi come viene risolto?