Come evitare tipici "errori linguistici dinamici"?

42

Recentemente ho riversato un paio di ore su JavaScript perché volevo beneficiare della massiccia base di utenti. Così facendo ho notato un modello che la maggior parte delle persone attribuisce alle lingue dinamiche. Le cose funzionano molto velocemente, ma una volta che il codice raggiunge una certa dimensione, perdi molto tempo con errori di tipo, di ortografia e di refactoring in generale. Errori che un compilatore normalmente mi eviterebbe. E non ho cercato errori nella logica quando ho appena digitato in un altro modulo.

Considerando l'incredibile seguente JavaScript e altre lingue tipizzate dinamicamente, sono portato a credere che ci sia qualcosa di sbagliato nel mio approccio. O è solo il prezzo che devi pagare?

Per dirla in modo più conciso:

  • Come ti avvicini a un progetto JavaScript (o qualsiasi altro linguaggio dinamico) con ~ 2000 LOC?
  • Ci sono strumenti per impedirmi di fare quegli errori? Ho provato il flusso da Facebook e JSHint che in qualche modo aiutano, ma non catturare errori di battitura.
posta TomTom 09.05.2016 - 15:43
fonte

5 risposte

37

In particolare, per quanto riguarda JavaScript, potresti utilizzare TypeScript . Offre alcune delle cose a cui ti riferisci. Citando il sito web:

Types enable JavaScript developers to use highly-productive development tools and practices like static checking and code refactoring when developing JavaScript applications.

Ed è solo un superset di JS, il che significa che alcuni dei tuoi codici esistenti funzioneranno correttamente con TS:

TypeScript starts from the same syntax and semantics that millions of JavaScript developers know today. Use existing JavaScript code, incorporate popular JavaScript libraries, and call TypeScript code from JavaScript.

    
risposta data 09.05.2016 - 15:52
fonte
19

Ci sono alcuni approcci che possono aiutare:

Test dell'unità

Scrivi i test unitari laddove possibile. Fare affidamento su test manuali o trovare bug in natura è un vero colpo.

Usa framework

Piuttosto che lanciare il tuo e rischiare l'introduzione di bug, usa i framework stabiliti dove possibile.

Preferisci le lingue CSS / di alto livello

Dove puoi cedere le funzionalità ai CSS o qualsiasi altro linguaggio di alto livello in cui stai scrivendo.

Refactor

Refactor per ridurre la quantità di codice. Meno codice = meno posti in cui le cose vanno male.

Riutilizzo

Riutilizza il codice esistente dove puoi. Anche se il codice non è una corrispondenza esatta, può essere meglio copiare, incollare e modificare piuttosto che scrivere qualcosa di nuovo.

IDE

Gli IDE moderni generalmente hanno almeno un po 'di supporto per Javascript. Alcuni editor di testo sono anche Javascript.

    
risposta data 09.05.2016 - 15:56
fonte
2

Uno strumento che non è stato ancora menzionato è semplice, per la ricerca di testo a livello di file o di progetto

.

Sembra semplice, ma quando includi alcune espressioni regolari puoi eseguire alcuni filtri di base o avanzati, ad es. cerca le parole che si trovano nella documentazione o nel codice sorgente.

Per me è stato uno strumento efficace (oltre agli analizzatori statici) e, date le dimensioni del progetto di 2k LOC, che a mio parere non è particolarmente grande, dovrebbe sperare di fare miracoli.

    
risposta data 10.05.2016 - 00:08
fonte
1

Attualmente sto rifattendo diverse migliaia di righe di codice su un grande progetto AngularJS. Uno dei problemi più grandi è quello di capire il contratto esatto di una determinata funzione. A volte ho finito per leggere la documentazione dell'API perché elementi della risposta API grezza venivano assegnati a variabili passate attraverso 6 strati di codice prima di essere modificati e restituiti attraverso altri 6 livelli di codice.

Il mio primo consiglio è di design per contratto . Prendi input specifici, produci output specifici, evita gli effetti collaterali e documenta quelle aspettative usando TypeScript o almeno JSDoc.

Il mio secondo consiglio è di implementare quanti più controlli possibili. Seguiamo lo standard AirBnB e usiamo eslint sull'intera nostra base di codice. I ganci di commit verificano che seguiamo sempre lo standard. Abbiamo naturalmente una batteria di unità e test di accettazione, e tutti i commit devono essere esaminati da un pari.

Passare da un editor di testo (Sublime Text) a un IDE corretto (WebStorm) ha reso anche molto più semplice lavorare con il codice in generale. WebStorm utilizzerà JSDoc per fornire suggerimenti sui tipi di parametri previsti e generare un errore se si fornisce il tipo sbagliato o si utilizza il valore restituito nel modo sbagliato.

In JavaScript, le nuove funzionalità come simboli e getter / setter possono aiutare a rafforzare un certo livello di qualità aggiungendo asserzioni all'assegnazione delle variabili (ad esempio, assicurati che il numero intero sia compreso nell'intervallo o che l'oggetto dati abbia determinati attributi). / p>

Sfortunatamente, non penso che esista una vera soluzione per evitare errori di linguaggio dinamici, solo una serie di misure che possono aiutare a ridurre la loro frequenza.

    
risposta data 18.05.2016 - 13:00
fonte
0

La mia risposta alla domanda "Come ti avvicini a un progetto JavaScript (o qualsiasi altro linguaggio dinamico) con ~ 2000 LOC?"

Sviluppo applicazioni per moduli PDF. Mi avvicino al mio progetto di sviluppo di software JavaScript (indipendentemente dalle dimensioni del codice sorgente) utilizzando gli elementi e le annotazioni della rete di Petri. Il metodo non è legato ad alcuna particolare tecnologia del linguaggio di programmazione. Pertanto può essere utilizzato per altri "linguaggi di programmazione".

Creo un diagramma della logica dell'applicazione. Per mantenere il diagramma in ordine, aggiungo la maggior parte delle mie annotazioni a un modulo che uso con il diagramma. Le voci nel modulo includono riferimenti a proprietà o funzioni. Quindi scrivo il codice sorgente in base alle informazioni nel diagramma e alle voci nel modulo. Il metodo è sistematico perché ogni codice sorgente scritto è direttamente mappato dal diagramma e dalle voci nel modulo. Il codice sorgente può essere facilmente controllato perché seguo anche le convenzioni di denominazione e codifica quando scrivo il codice.

Ad esempio, ho scelto una convenzione per cui tutte le funzioni sono prototipi. Se le prestazioni diventano un problema, può essere migliorato dichiarando le funzioni nel costruttore. Per alcune proprietà uso array. Ancora una volta se le prestazioni diventano un problema, allora può essere migliorato usando i riferimenti diretti.

Uso anche eval. Questo può ridurre notevolmente la dimensione del codice sorgente. A causa di problemi di prestazioni, utilizzo eval nella parte iniziale o di inizializzazione della mia applicazione; Non lo uso mai nella "logica di runtime" - questa è un'altra convenzione di codifica che seguo.

    
risposta data 25.07.2016 - 00:36
fonte

Leggi altre domande sui tag