Newbie che scrive dinamicamente qui, sperando in alcune parole avvizzite di saggezza.
Sono curioso di sapere se esiste una serie di best practice per trattare gli argomenti delle funzioni (e siamo onesti, le variabili in generale) in linguaggi tipizzati dinamicamente come Javascript. Il problema che mi imbatto spesso riguarda la leggibilità del codice: sto osservando una funzione che ho scritto qualche tempo fa e non ho idea di cosa sia effettivamente la struttura delle variabili dell'argomento. Di solito è ok al momento dello sviluppo del nuovo codice: tutto è fresco nella mia testa, ogni variabile e parametro ha senso perché li ho appena scritti. Una settimana dopo? Non così tanto.
Ad esempio, supponiamo che sto cercando di scricchiolare una serie di dati sulle sessioni utente su un sito Web e di ricavarne qualcosa di utile:
var crunchSomeSessionData = function(sessionsMap, options) {
[...]
}
Ignorare il fatto che il nome della funzione non sia utile - che ovviamente è un grosso problema - in realtà non so nulla su quale sia la struttura di sessionMap o delle opzioni. Ok .. Ho k / v accoppiare l'oggetto sessionMap, dato che si chiama Map, ma il valore è un primitivo, un array, un altro hash di roba? Cosa sono le opzioni? Un array? Una stringa separata da spazi bianchi?
Ho alcune opzioni:
- chiarire la struttura esattamente nell'intestazione del commento per la funzione. Il problema è che ora devo mantenere il codice in due punti.
- avere un nome il più utile possibile. per esempio. userIdToArrayOfTimestampsMap o anche avere qualche tipo di dialetto pseudo-ungherese per la denominazione delle variabili che solo io parlo che spiega quali sono i tipi e come sono nidificati. Questo porta a un codice veramente prolisso, e sono un fan del mantenimento di materiale inferiore a 80 punti.
- interrompe le funzioni finché non passo sempre in giro primitive o raccolte di primitive. Immagino che potrebbe funzionare, ma probabilmente finirei con micro-funzioni che hanno al massimo una o due righe, funzioni che esistono solo allo scopo di leggibilità. Ora devo saltare tutto il file e ricomporre la funzione nella mia testa, il che ha reso la leggibilità ancora peggiore.
- alcune lingue offrono la destrutturazione, che in qualche misura può quasi essere considerata una documentazione extra per ciò che il tipo di argomento sta per contenere.
- potrebbe creare una "classe" per il tipo specifico di oggetto, anche se non farebbe un'enorme differenza in un linguaggio prototipale come JS, e probabilmente aggiungerebbe più spese di manutenzione del necessario. In alternativa, se disponibile, si può provare a usare i protocolli, forse qualcosa sulla falsariga di deftype / defrecord di Clojure ecc.
Nel mondo tipizzato staticamente, questo non è un problema. Ad esempio in C # si ottiene:
public void DoStuff(Dictionary<string, string> foo) {[...]};
Ok, è facile, so esattamente cosa sto ricevendo, non c'è bisogno di leggere l'intestazione della funzione, o tornare al chiamante e capire cosa sta architettando ecc.
Qual è la soluzione qui? Tutte le persone che si sviluppano in lingue digitate dinamicamente sono continuamente sconvolte dai tipi che ricevono le loro subroutine? Esistono strategie di mitigazione?