In che modo un programmatore utilizzato per i linguaggi statici affronta la mancanza di strumenti Javascript


28

Ho programmato praticamente esclusivamente in linguaggi compilati, in particolare Java, per gran parte della mia carriera. Una delle mie cose preferite su Java è quanto puoi essere produttivo e quanto poco codice devi effettivamente scrivere quando usi strumenti come Eclipse.

Puoi:

  • Rifattorizza facilmente e automaticamente i tuoi metodi e le tue classi
  • Visualizza istantaneamente tutti i luoghi in cui viene invocato un metodo o viene utilizzata una costante (Gerarchia chiamate aperte / Mostra riferimenti)
  • La digitazione statica significa che è possibile utilizzare il completamento del codice per mostrare tutti i parametri / funzioni disponibili su un oggetto
  • Fai clic tenendo premuto il tasto Ctrl su un nome di funzione / membro / classe per passare direttamente alla sua definizione

Tutte queste strutture mi fanno sentire come l'IDE sia il mio migliore amico. Scrivere codice Java e comprendere in particolare i programmi di altre persone diventa molto più semplice.

Tuttavia, mi viene sempre più richiesto di utilizzare Javascript e la mia esperienza finora è stata piuttosto negativa.

In particolare:

  • Nessun modo immediato per trovare il punto di ingresso di una funzione (diverso da una ricerca in testo semplice, che può quindi portare a una successiva ricerca di metodi più in alto nella gerarchia di chiamate, dopo due o tre dei quali hai dimenticato da dove hai iniziato)

  • I parametri vengono passati alle funzioni, senza alcun modo di sapere quali proprietà e funzioni sono disponibili su quel parametro (tranne che eseguire effettivamente il programma, navigare fino al punto in cui viene chiamata la funzione e usare console.logs per generare tutte le proprietà a disposizione)

  • L'uso comune di funzioni anonime come callback, che spesso porta a uno spaghetto di percorsi di codice confusi, che non è possibile navigare rapidamente.

  • E sicuramente, JSLint rileva alcuni errori prima del runtime, ma anche questo non è utile come avere linee ondulate rosse sotto il tuo codice direttamente nel browser.

Il risultato è che devi praticamente avere l'intero programma in testa in ogni momento. Ciò aumenta notevolmente il carico cognitivo per la scrittura di programmi complessi. E tutte queste cose extra di cui preoccuparmi lasciano meno spazio nel mio cervello per la vera creatività e risoluzione dei problemi.

Certo, è più veloce semplicemente unire un oggetto piuttosto che scrivere un'intera definizione di classe formale. Ma mentre i programmi possono essere leggermente più facili e veloci da scrivere, secondo la mia esperienza sono molto più difficili da leggere ed eseguire il debug.

La mia domanda è: in che modo gli altri programmatori affrontano questi problemi? Javascript sta chiaramente crescendo in popolarità e i blog che leggo parlano di come le persone produttive lo stanno facendo, piuttosto che cercare disperatamente di trovare soluzioni a questi problemi.

GWT ti consente invece di scrivere codice per un ambiente Javascript in Java, ma non sembra essere ampiamente usato come mi aspetterei; le persone sembrano preferire Javascript per programmi complessi.

Cosa mi sto perdendo?


8
Il mio consiglio a tutti gli sviluppatori Java che hanno difficoltà con JS è quello di imparare un'altra lingua che non ha una sintassi basata su C. Ti aiuterà a superare la sintassi-somiglianza quando torni a JS e potrebbe aiutarti a iniziare a guardare cose in termini di compromessi del design del linguaggio piuttosto che vedere le cose in termini di un unico vero modo per scrivere tutto il codice e il modo in cui tutti gli altri si sbagliano. E se ti viene l'idea di scrivere un framework UI, per favore impara JavaScript prima di sellarci con l'ennesimo pezzo di spazzatura a cascata di classe gonfiabile che è inspiegabilmente facile da commercializzare a CTO senza indicazioni.
Erik Reppen,

5
Amico, che snob mi è stato 2 anni fa. Proverò ad essere un po 'più utile ora che di recente ho colpito di più Java. IDE? Dai un'occhiata al Jetbrains Webstorm (io uso ancora Scite principalmente ma WS non è male), ma per il web lato client, gli strumenti di sviluppo di Chrome fanno un ottimo lavoro nel coprirti durante il debug e in realtà esegue il completamento automatico quando si scrivono frammenti di codice nella console. Inoltre, passa molto tempo a pensare a OOP. L'IMO, le classi non opzionali e gli IDE come sostituti della leggibilità umana hanno assolutamente ucciso tutto il punto di OOP in molte Java là fuori.
Erik Reppen,

2
Condivido il tuo dolore. La discesa in javascript è la versione web della discesa in linguaggio assembly sul lato client. Può sicuramente essere divertente, ma i set di strumenti sono deboli e la produttività diminuisce sicuramente con tutto il lavoro extra che devi fare. Questa è la vita nella programmazione però. Non tutto deve essere fatto al massimo livello di astrazione. :-)
Brian Knoblauch,

2
@ErikReppen Ho iniziato come sviluppatore Java ma sono fluente in Obj-C, programmato in Ruby, Delphi, C ++, C #, Prolog, PHP, bash e trovo ancora javascript il peggiore da leggere e mantenere.
Sulthan,

2
Dai un'occhiata a TypeScript. Una volta che ho iniziato a usarlo, trovo la codifica lato client molto più produttiva e piacevole. Difficile da battere con la corretta intelligisense e i primi avvertimenti del compilatore.
Evgeni,

Risposte:


22

Le prelibatezze basate su IDE non sono disponibili * in un linguaggio dinamico come javascript. Devi imparare a fare a meno di loro. Dovrai sostituire il supporto degli strumenti con un design migliore.

Usa un modello di modulo - a mano o con uno strumento come requirejs . Mantenere i moduli piccoli, in modo da poter ragionare facilmente su di essi.

Non definire tanti tipi : usa oggetti anonimi creati vicino al punto di chiamata. Quindi puoi guardare chi chiama e chi chiama e sapere cosa sta succedendo.

Cerca di evitare di associare il tuo codice al DOM - Cerca di limitare la quantità di manipolazione del DOM che esegui nel tuo codice. Se riesci a passare in selettori o raccolte jQuery, fallo invece di far conoscere al tuo codice la struttura della pagina.

* Se stai usando una libreria popolare, puoi ottenere il completamento automatico falso, ma è più simile a "mostra tutti i metodi jquery" piuttosto che a "quali proprietà ha questo oggetto". Salva la digitazione, ma non offre alcuna garanzia di correttezza.


Accettare questo per consigli costruttivi su come affrontare la mancanza di strumenti.
funkybro,

3
"Devi imparare a farne a meno." O scartalo O usa un linguaggio di livello superiore che genera javascript e ha strumenti adeguati.
Den,

@Den: hai un suggerimento per un linguaggio di livello superiore con strumenti avanzati? Nella mia esperienza, sono stati creati strumenti avanzati per le lingue popolari. Quale linguaggio di livello superiore che si compila in javascript è abbastanza popolare per avere tali strumenti?
Sean McMillan,

1
@SeanMcMillan: alcuni esempi di .NET (C # / F #) sono jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Den

1
@SeanMcMillan Java, vedi GWT developers.google.com/web-toolkit
funkybro

24

Vorrei aggiungere una risposta a questa domanda dato che ultimamente ho attraversato un po 'di buono, cattivo ma soprattutto brutto Java e ho un nuovo carico enorme di generalizzazioni eccessive grossolane su sviluppatori Java e Java rispetto a JS e Gli sviluppatori di JS che potrebbero effettivamente basarsi su qualcosa che ricorda vagamente la verità utile.

Ci sono IDE ma può essere utile capire perché non ce ne sono stati molti

Ho provato Webstorm ora che mi trovo attratto dallo sviluppo di Node e non è poi così male che l'ho effettivamente comprato, ma tendo ad aprire i file js in Scite più spesso di WS. Il motivo è che puoi fare molto di più con molto meno in JS ma anche perché il lavoro dell'interfaccia utente fornisce un feedback immediato, gli strumenti di sviluppo del browser (Chrome e Firebug in particolare) sono in realtà piuttosto eccellenti e (tenendo conto dei contesti non browser ) rieseguire il codice modificato è semplice e veloce senza un passo di compilazione.

Un'altra cosa di cui sono abbastanza convinto è che gli IDE fondamentalmente creano la propria domanda abilitando il codice sciatto che non si può davvero permettere in JavaScript. Vuoi imparare come gestiamo JS? Potrebbe essere utile iniziare cercando di scrivere qualcosa di non banale in Java senza un IDE e prestare molta attenzione alle cose che devi iniziare a fare e pensare per poter effettivamente mantenere / modificare quel codice senza un IDE in movimento inoltrare. IMO, quelle stesse cose sono ancora fondamentali per la scrittura di codice gestibile sia che tu abbia un IDE o meno. Se dovessi scrivere un curriculum di programmazione di 4 anni, non ti lascerei toccare un IDE per i primi due anni, nell'interesse di non stravolgere strumenti e dipendenze.

Struttura

Gli sviluppatori esperti di JS che si occupano di applicazioni complesse possono e strutturare il loro codice. In effetti è una cosa su cui tendiamo a essere migliori con una storia antica in cui mancavano gli IDE per leggere il codice per noi, ma anche perché i linguaggi fortemente espressivi possono esprimere in modo potente potenze di codice di disastro completamente non mantenibili molto rapidamente se non si codifica pensieroso.

In realtà ho avuto una curva di apprendimento piuttosto ripida nel comprendere la nostra base di codice Java di recente fino a quando ho finalmente capito che nessuno di questi era OOP corretto. Le classi non erano altro che fasci di metodi vagamente correlati che alterano i dati disponibili a livello globale in giro in bean o DTO o getter / setter statici. È sostanzialmente la stessa vecchia bestia che OOP avrebbe dovuto sostituire. Quindi ho praticamente smesso di cercare e pensare al codice. Ho appena appreso i tasti di scelta rapida e tracciato i pasticci e tutto è andato molto più agevolmente. Quindi, se non hai già l'abitudine, pensa molto di più a OOD.

Un'app JS ben strutturata ai massimi livelli tenderà a consistere di funzioni complesse (ad esempio jQuery) e oggetti che interagiscono tra loro. Direi che il segno di un'app ben strutturata e facilmente gestibile in qualsiasi lingua è che è perfettamente leggibile se la stai guardando con un IDE o Notepad ++. È uno dei motivi principali per cui sono estremamente critico nei confronti dell'iniezione di dipendenza e del TDD test-first portato all'estremo.

E infine, lascia andare le lezioni. Scopri l'eredità prototipale. In realtà è abbastanza elegante facile da implementare quando in realtà hai bisogno dell'eredità. Trovo che gli approcci di composizione tendano a funzionare molto meglio in JS, tuttavia, e personalmente inizio a ammalarmi e ho terrori notturni EXTJS ogni volta che vedo più di uno o due livelli di eredità in qualsiasi lingua.

Principi fondamentali in primo luogo

Sto parlando delle cose fondamentali da cui dovrebbero derivare tutte le altre buone pratiche: DRY, YAGNI, il principio del minimo stupore, la netta separazione dei domini problematici, la scrittura su un'interfaccia e la scrittura di codice leggibile umano sono il mio nucleo personale. Qualunque cosa un po 'più complessa che sostenga l'abbandono di tali pratiche dovrebbe essere considerata un aiuto Kool in qualsiasi lingua, ma soprattutto una lingua come JavaScript in cui è estremamente facile lasciare un'eredità di codice molto confuso per il prossimo. L'accoppiamento allentato, ad esempio, è una grande cosa fino a quando non lo spingi così lontano da non riuscire nemmeno a capire dove sta avvenendo l'interazione tra gli oggetti.

Non temere la digitazione dinamica

Non ci sono molti tipi principali in JavaScript. Per la maggior parte, le regole di casting dinamico sono pratiche e dirette, ma vale la pena apprenderle in modo da poter imparare meglio a gestire il flusso di dati senza cast inutili e routine di validazione inutili. Fidati di me. I tipi rigorosi sono ottimi per le prestazioni e individuano i problemi durante la compilazione, ma non ti proteggono da nulla.

Impara la schifezza di JS Funzioni e chiusure

Le funzioni di prima classe di JS sono probabilmente il motivo principale per cui JS ha vinto il premio "Solo la lingua che vale la pena toccare il Web lato client con il premio". E sì, in realtà c'era competizione. Sono anche una caratteristica centrale di JS. Costruiamo oggetti con loro. Tutto è mirato alle funzioni. E hanno funzioni utili. Possiamo esaminare i parametri tramite la parola chiave argomenti. Possiamo collegarli e licenziarli temporaneamente nel contesto di essere metodi di altri oggetti. E rendono gli approcci guidati dagli eventi a cose oscenamente facili da implementare. In breve, hanno reso JS un'assoluta bestia nel ridurre la complessità e nell'adattare le diverse implementazioni di JS stesso (ma principalmente l'API DOM) direttamente alla fonte.

Rivalutare i modelli / le pratiche prima di adottare

Le funzioni di prima classe e i tipi dinamici rendono molti dei modelli di progettazione più complessi completamente inutili e ingombranti in JS. Alcuni dei modelli più semplici, tuttavia, sono incredibilmente utili e facili da implementare data la natura altamente flessibile di JS. Gli adattatori e i decoratori sono particolarmente utili e ho trovato i singoli utili per le complesse fabbriche di widget UI che fungono anche da gestori di eventi per gli elementi dell'interfaccia utente che costruiscono.

Segui l'esempio della lingua e fai di più con meno

Credo che uno dei principali honchos di Java renda l'argomento da qualche parte che la verbosità è in realtà una caratteristica positiva che rende il codice più facile da capire per tutte le parti. Fesserie. Se ciò fosse vero, il legalese sarebbe più facile da leggere. Solo lo scrittore può rendere ciò che hanno scritto più facile da capire e puoi farlo solo mettendoti nei panni dell'altro ragazzo di tanto in tanto. Abbraccia quindi queste due regole. 1. Sii il più diretto e chiaro possibile. 2. Arriva già a quel dannato punto. La vittoria è che il codice pulito e conciso rende gli ordini di grandezza più facili da capire e mantenere rispetto a qualcosa in cui devi attraversare venticinque livelli per passare dal grilletto all'azione desiderata reale. La maggior parte dei modelli che sostengono quel genere di cose in linguaggi più rigorosi sono in realtà soluzioni alternative per limitazioni che JavaScript non ha.

Tutto è malleabile e va bene

JS è probabilmente uno dei linguaggi meno protezionistici di uso popolare. Abbraccialo. Funziona bene Ad esempio, puoi scrivere oggetti con varchi "privati" persistenti inaccessibili semplicemente dichiarando var regolari in una funzione di costruzione e lo faccio spesso. Ma non è per proteggere il mio codice o gli utenti "da se stessi" (potrebbero comunque sostituirlo con la propria versione durante il runtime). Ma piuttosto è un segnale dell'intenzione perché il presupposto è che l'altro ragazzo è abbastanza competente da non voler manipolare alcuna dipendenza e vedrà che non sei destinato a raggiungerlo direttamente forse per una buona ragione.

Non ci sono limiti di dimensione, solo domini problematici

Il problema più grande che ho con tutte le basi di codice Java che ho visto è una sovrabbondanza di file di classe. Prima di tutto SOLID è solo una reiterazione confusa di ciò che dovresti già sapere su OOP. Una classe dovrebbe gestire una serie specifica di problemi correlati. Nessun problema con un metodo. Questo è solo prendere il vecchio codice C concatenato di funzioni-spaghetti solo con l'aggiunta di tutta la sintassi della classe inutile per l'avvio. Non ci sono limiti di dimensioni o metodi. Se ha senso aggiungere qualcosa a una funzione o classe o costruttore già lunga, ha senso. Prendi jQuery. È un intero set di strumenti della lunghezza di una libreria in un'unica funzione e non c'è nulla di sbagliato in questo. Se abbiamo ancora bisogno di jQuery dipende da un ragionevole dibattito, ma in termini di design,

Se Java è tutto ciò che sai, cavalca in qualcosa con una sintassi non basata su C.

Quando ho iniziato a fare scherzi con Python perché mi piaceva quello che stavo ascoltando su Django, ho imparato a iniziare a separare la sintassi dal design del linguaggio. Di conseguenza, è diventato più facile capire Java e C come una somma delle loro parti di progettazione del linguaggio piuttosto che una somma di cose che fanno diversamente con la stessa sintassi. Un piacevole effetto collaterale è che più capisci le altre lingue in termini di design, meglio capirai i punti di forza / debolezza di quello che conosci meglio attraverso il contrasto.

Conclusione

Ora, considerando tutto ciò, lascia che colpisca tutti i tuoi punti problematici:

  • Nessun modo immediato per trovare il punto di ingresso di una funzione (diverso da una ricerca in testo semplice, che può quindi portare a una successiva ricerca di metodi più in alto nella gerarchia di chiamate, dopo due o tre dei quali hai dimenticato da dove hai iniziato)

Chrome e Firebug hanno effettivamente il tracciamento delle chiamate. Ma vedi anche i miei punti sulla struttura e sul mantenere le cose concise e dirette. Più puoi pensare alla tua app come costrutti ben incapsulati più grandi che interagiscono tra loro, più è facile capire di chi è la colpa quando le cose vanno male. Direi che questo vale anche per Java. Abbiamo costruttori di funzioni di classe che sono perfettamente utili per le preoccupazioni tradizionali di OOP.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

Nel mio codice, non uso quasi mai i letterali degli oggetti {}come componenti strutturali dell'app poiché non possono avere var interni (privati) e preferiscono invece riservarli per l'uso come strutture di dati. Ciò aiuta a stabilire un'aspettativa che mantiene la chiarezza delle intenzioni. (se vedi i ricci, sono i dati, non un componente dell'architettura dell'app).

  • I parametri vengono passati alle funzioni, senza alcun modo di sapere quali proprietà e funzioni sono disponibili su quel parametro (tranne che eseguire effettivamente il programma, navigare fino al punto in cui viene chiamata la funzione e usare console.logs per generare tutte le proprietà a disposizione)

Ancora una volta, vedi i moderni strumenti del browser. Ma anche, perché è un tale peccato eseguire nuovamente il programma? Ricaricare è qualcosa che un web dev lato client colpisce in genere ogni pochi minuti perché non ti costa assolutamente nulla per farlo. Anche in questo caso, un altro punto con cui può essere utile la struttura dell'app ma è uno svantaggio di JS che devi eseguire la tua convalida quando far rispettare i contratti è fondamentale (qualcosa che faccio solo agli endpoint esposti ad altre cose che la mia base di codice non fa controllo). IMO, il compromesso vale i vantaggi.

  • L'uso comune di funzioni anonime come callback, che spesso porta a uno spaghetto di percorsi di codice confusi, che non è possibile navigare rapidamente.

Sì, è negativo per qualsiasi cosa non banale. Non farlo. Dai un nome alle tue funzioni per bambini. È anche più facile rintracciare le cose. È possibile definire, valutare (richiesto per assegnare) e assegnare una semplice funzione banale in linea con:

doSomethingWithCallback( (function callBack(){}) );

Ora Chrome avrà un nome per te quando segui le chiamate. Per funzioni non banali lo definirei al di fuori della chiamata. Si noti inoltre che le funzioni anonime assegnate a una variabile sono ancora anonime.

  • E sicuramente, JSLint rileva alcuni errori prima del runtime, ma anche questo non è utile come avere linee ondulate rosse sotto il tuo codice direttamente nel browser.

Non tocco mai le cose. Crockford ha dato alcune cose positive alla comunità, ma JSLint supera le preferenze stilistiche e suggerisce che alcuni elementi di JavaScript sono parti cattive senza una ragione particolarmente buona, IMO. Ignora definitivamente quella cosa su regEx e le classi di negazione seguite da * o +. I caratteri jolly si comportano in modo più scadente e puoi facilmente limitare la ripetizione con {}. Inoltre, ignora tutto ciò che dice sui costruttori di funzioni. Puoi avvolgerli facilmente in una funzione di fabbrica se la nuova parola chiave ti dà fastidio. CSSLint (non quello di Crockford) è ancora peggio sul fronte dei cattivi consigli. Prendi sempre le persone che fanno molti discorsi con un granello di sale. A volte giuro che stanno solo cercando di stabilire autorità o generare nuovo materiale.

E di nuovo, devi disimparare ciò che hai imparato con questa preoccupazione di runtime che hai. (è comune che ho visto con molti sviluppatori Java / C #) Se vedere gli errori in fase di esecuzione ti disturba ancora 2 anni dopo, voglio che ti sieda e lo spam venga ricaricato in un browser fino a quando non affonda. non è una divisione tempo di compilazione / runtime (benché comunque non visibile - JS viene eseguito su un JIT ora). Scoprire i bug in fase di esecuzione non è solo corretto, ma è estremamente vantaggioso ricaricare lo spam in modo così economico e facile e scoprire i bug in ogni punto di arresto.

E fai crackin su quegli strumenti di sviluppo di Chrome. Sono integrati direttamente nel webkit. Fare clic con il tasto destro in Chrome. Ispeziona elemento. Esplora le schede. Un sacco di potenza di debug lì con la possibilità di alterare il codice nella console durante il runtime essendo una delle opzioni più potenti ma meno ovvie. Ottimo anche per i test.

In una nota correlata, gli errori sono i tuoi amici. Non scrivere mai una dichiarazione di cattura vuota. In JS non nascondiamo o seppelliamo errori (o almeno non dovremmo tossire YUI / tosse ). Ci occupiamo di loro. Qualcosa di meno provocherà dolore di debug. E se scrivi un'istruzione catch per nascondere potenziali errori nella produzione, registra almeno in silenzio l'errore e documenta come accedere al registro.


3
Voto per la dimensione della risposta ...
Florian Margaine

5

Quello che stai dicendo è solo la lamentela comune di una persona con mentalità Java che guarda JavaScript.

Prima rispondiamo alla tua domanda ...

... la mia domanda è: come fanno gli altri programmatori ad affrontare questi problemi ...

Risposta: NON. Imparano la filosofia JavaScript rinunciando prima al culto di Java.

Devi capire questa premessa ... JavaScript NON è Java. Non si tratta solo di sintassi: riguarda piuttosto la filosofia.

Ora prendiamone alcuni ...

  • Visualizza istantaneamente tutti i luoghi in cui viene invocato un metodo o viene utilizzata una costante (Gerarchia chiamate aperte / Mostra riferimenti)

    Fai clic tenendo premuto il tasto Ctrl su un nome di funzione / membro / classe per passare direttamente alla sua definizione

    Tutti questi sono disponibili - basta scegliere un IDE decente.

  • La digitazione statica significa che è possibile utilizzare il completamento del codice per mostrare tutti i parametri / funzioni disponibili su un oggetto

    Questo non è un problema che devi affrontare . Questo è qualcosa che richiede di cambiare la tua visione della programmazione. Il sistema di tipo sciolto è uno dei punti di forza di JavaScript. Comprendi la digitazione libera e impara ad apprezzarla. Inoltre, il completamento del codice funziona molto bene con JS.

  • E sicuramente, JSLint rileva alcuni errori prima del runtime, ma anche questo non è utile come avere linee ondulate rosse sotto il tuo codice direttamente nel browser.

    Firebug, la console Chrome / Safari e persino gli IDE fanno tutto questo e ALTRO.

    C'è JSHint che può fare la nifty analisi statica a cui sono abituati i programmatori Java.

  • Il risultato è che devi praticamente avere l'intero programma in testa in ogni momento. Ciò aumenta notevolmente il carico cognitivo per la scrittura di programmi complessi.

    Sbagliato! Al contrario, JavaScript è un linguaggio di programmazione "leggero" e ti incoraggia ad avere programmi più semplici. Come dice Doug Crockford ... ti punirà se provassi a scrivere programmi fortemente basati su modelli in JavaScript.

  • mentre i programmi possono essere leggermente più facili e veloci da scrivere, secondo la mia esperienza sono molto più difficili da leggere e eseguire il debug.

    Totalmente sbagliato! Come decidi la leggibilità in base al linguaggio di programmazione? I programmi sono leggibili (o meno) - NON lingue. Inoltre, JavaScript ha debugger fantastici.

Scusami se ho suonato un po 'maleducato, ma la verità è che devi cambiare la tua disposizione Java per capire JavaScript.

Solo i programmatori Java "maturi" possono apprezzare JavaScript e non puoi dominare ciò che non apprezzi. Ancora una volta, scusami per essere schietto.


2
Hai un esempio di IDE JavaScript in cui posso "fare clic tenendo premuto il tasto Ctrl su un nome di funzione / membro / classe per andare direttamente alla sua definizione"? Uso Eclipse per Java e Scala ma manca un buon IDE / Editor per JavaScript.
Jonas,

11
Preparato a prendere alcune critiche, ma alcune cose qui sono abbastanza sbagliate. Se creo un oggetto e lo passo in una funzione, posso ctrl-clic sul parametro e visualizzarne le proprietà? No, non posso, perché l'oggetto potrebbe essere qualsiasi cosa. Se scrivo male uno dei nomi delle proprietà dell'oggetto, mi avviserà? No, perché non è un errore in JS, anche se probabilmente non è mai quello che vuoi. Il completamento del codice utile è impossibile. Scoprire quali proprietà possiede il parametro di una funzione implica lo spelunking attraverso il codice invocato la funzione, per scoprire dove è stato creato l'oggetto.
funkybro,

3
Puoi lamentarti del fatto che il modo in cui JS è costruito rende più difficile la codifica per gli IDE. Mi lamenterei che in Java non posso semplicemente attaccare le proprietà dinamiche a dannatamente vicino a tutto ciò che voglio o fare introspezione sugli oggetti durante il runtime. Le due lingue sono molto diverse nella filosofia. Penso in modi che creano una disconnessione più ampia tra gli sviluppatori Java e JS rispetto a quella tra JS e la maggior parte delle altre lingue. Personalmente trovo C più facile da adattare rispetto a Java e detesto lavorare con un IDE gonfio.
Erik Reppen,

2
Anche gli sviluppatori Java di Google non riescono a togliersi la testa da Java quando scrivono JS. sitepoint.com/google-closure-how-not-to-write-javascript
Erik Reppen

3
Scrivi: JavaScript NON è Java e devi modificare la tua disposizione Java per capire JavaScript seguito da: Solo i programmatori Java "maturi" possono apprezzare JavaScript ... Quindi per capire Javascript devo prima padroneggiare Java e poi dimenticare tutto vero?
Caleb,

3

In generale, è difficile avere gli strumenti che hai citato per un linguaggio dinamico (a meno che l'IDE non faccia parte del runtime, ad esempio Smalltalk). Detto questo, una volta appreso un editor di testo davvero valido, la maggior parte degli IDE sembrano meno attraenti - questa è almeno la mia esperienza.


2

Questo è il prezzo che paghiamo per l'utilizzo di lingue mal digitate. Ci si può solo chiedere perché questo abominio sia diventato così popolare. Gli svantaggi superano di gran lunga i vantaggi delle lingue mal digitate.

Forse dovremmo applicare il principio di non cooperazione a questa spazzatura per farla sparire.


3
"lingue mal digitate" - Molti programmatori non sarebbero d'accordo con te.
Sean McMillan,

7
+1, l'unica ragione per cui Javascript è popolare è perché era nel posto giusto al momento giusto.
maple_shaft

2
Ragazzi, siete semplicemente tristi del fatto che Node.js abbia dei collegamenti al C ++ anziché a Java, vero?
Erik Reppen,

1
Non sono sicuro di cosa si intenda per "lingue mal digitate". JavaScript non è "mal digitato". È tipizzato in modo dinamico e le operazioni possono causare la coercizione del tipo. Non dare la colpa alla lingua perché il tuo editor / IDE non conosce il tipo di variabile, dovresti comunque conoscerla.
Ryan Kinal,

3
@RyanKinal Davvero? Dovresti conoscere tutte le proprietà e i metodi di tutti gli oggetti e le classi all'interno della tua intera app e dell'API della tua lingua e quella di tutte le librerie che stai utilizzando, a memoria ? Rifiuti il ​​concetto di completamento del codice IDE migliorando enormemente la produttività riducendo il carico cognitivo e dandoti meno cose a cui pensare?
funkybro,

2

Non amavo javascript (e la sua digitazione dinamica), ma ho imparato ad apprezzare l'orientamento agli oggetti, le chiusure e la programmazione funzionale . Inoltre, i suoi oggetti globali e la rimozione della conversione silenziosa del tipo erano una boccata d'aria fresca quando li ho trovati per la prima volta.

Il mio ide preferito per javascript è webstorm in quanto è facile far funzionare jQuery intellitext (peccato che non sia gratuito).

Inoltre, non direi che sta crescendo, è già onnipresente.

I tuoi punti specifici:

Nessun modo immediato per trovare il punto di ingresso di una funzione

Non lo capisco, come potrebbe essere più semplice?

I parametri vengono passati alle funzioni, senza modo di sapere quali proprietà e funzioni sono disponibili su quel parametro

Se imposti il ​​tuo ide per includere la definizione degli oggetti, le proprietà dell'oggetto saranno disponibili tramite intellitext (ma potrei aver perso il tuo punto qui).

L'uso comune di funzioni anonime come callback, che spesso porta a uno spaghetto di percorsi di codice confusi, che non è possibile navigare rapidamente.

Uso comune? Se non ti piacciono le funzioni anonime, non usarle. O ti riferisci a jQuery che li utilizza sostanzialmente? jQuery è probabilmente considerato dalla maggior parte degli sviluppatori web come il più grande risparmiatore di tempo nella storia dello sviluppo web .

JSLint rileva alcuni errori prima del runtime

Li cattura tutti, puoi includerli nel tuo ide . O Webstorm lo include per impostazione predefinita (penso).


Ad essere onesti onnipresente e popolare non sono necessariamente gli stessi! ;-) Ad ogni modo, webstorm è un IDE eccellente per JavaScript (e sebbene non gratuito sia piuttosto economico). Non l'ho usato ma credo che IntelliJ (anche di Jetbrains) contenga le stesse funzionalità che potrebbero essere rilevanti se si proviene da un background Java e si desidera utilizzare un singolo IDE.
Finlandia,

OK forse devo chiarire ... Volevo dire "crescere in popolarità" più nel contesto dello sviluppo al di fuori del browser / DOM. Cioè, viene utilizzato dove sono disponibili altre alternative. Con "punto di ingresso della funzione" intendevo localizzare il punto nel codice in cui viene invocata una funzione. Proprietà dei parametri: non è possibile che un IDE conosca le proprietà di un determinato oggetto prima dell'esecuzione! Funzioni anonime: potrebbero non piacermi, ma altri di cui devo mantenere il codice. JSLint non sa se ho sbagliato a digitare un nome di proprietà di un determinato oggetto, ad esempio.
funkybro,

@funkybro "non c'è modo per un IDE di conoscere le proprietà di un determinato oggetto prima del runtime" Esiste, basta includere "whateverMyObjectIs.js" come script di riferimento nell'ide, e per nomi di proprietà errati, prova webstorm, lo fa (se ricordo bene).
NimChimpsky,

3
Non c'è! Considerate questo codice: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Come può un completamento del codice offerta IDE myFunc's paramparametro? parampotrebbe essere qualsiasi oggetto di qualsiasi tipo, con qualsiasi proprietà.
funkybro,

Sì, ma presumibilmente i parametri che stai passando sono effettivamente disponibili in quel contesto. Un parser può risolverlo senza essere il proprio interprete JS in piena regola.
Erik Reppen,

2

Cosa mi sto perdendo?

Ti mancano i due enormi vantaggi che Javascript ha su Java:

  • Il codice Javascript ha circa un quarto delle dimensioni del codice Java equivalente.
  • Non devi mai attendere la compilazione e il riavvio del server.

Lavoro diversamente in Javascript. Aggiungo un po 'di codice alla volta, il meno che posso eventualmente testare, aggiorno il browser e testalo. Con jQuery, un paio di righe di Javascript sono tutto ciò di cui ho bisogno per la maggior parte del tempo.

Ho trovato la programmazione Java relativamente poco produttiva e sto scrivendo tutto il mio codice lato server in Groovy, per gli stessi due motivi.


5
"Il codice Javascript ha circa un quarto delle dimensioni del codice Java equivalente" <- questo è il problema! Certo, è veloce creare semplicemente funzioni anonime e aggiungere proprietà extra agli oggetti e lanciarli come coriandoli. Ma che dire quando qualcun altro visita il tuo codice e cerca di capire cosa sta succedendo? Inoltre, più codice in Java non equivale necessariamente a una maggiore digitazione ... Eclipse ne scrive così tanto per te.
funkybro,

3
@funkybro: Eclipse lo scrive ... poi sono bloccato a guardarlo oltre per la vita del progetto. Se è richiesto, ma un plug-in banale può generarlo, è un odore di lingua. Hai ragione sul fatto che le classi Javascript richiedono un po 'più di documentazione. Ma anche solo conoscere una firma del metodo Java non è sufficiente.
Kevin Cline,

1
Non è richiesto! È possibile simulare Javascript in Java invocando sempre metodi con reflection e utilizzando nient'altro che semplici oggetti, elenchi e mappe se proprio lo si desidera. Tuttavia la maggior parte degli sviluppatori IME (non tutto ciò che confesso!) Scelgono di definire tipi di dati significativi, poiché trovano che li aiuti a scrivere codice gestibile e autodocumentante!
funkybro,

1
La riflessione consente a Java di modificare gli oggetti durante il runtime? Che ne dici di chiusure? Impara la lingua prima di criticarla o assumere Java, il linguaggio a paradigma più chiuso al di fuori dell'assembly è in grado di emularla.
Erik Reppen,

1
Downvoter: questo non è un referendum su Java vs. Javascript. È maleducato votare verso il basso senza un motivo.
Kevin Cline il

0

So che questa domanda è vecchia ma come programmatore C ++ / C # che ha avuto gli stessi sentimenti ma che ora ha fatto un sacco di JavaScript negli ultimi 10 anni, la mia prima raccomandazione sarebbe di provare Visual Studio Code .

Ovviamente non può offrire tutte le funzionalità che possono essere aggiunte con un linguaggio fortemente tipizzato ma si avvicina abbastanza.

Può anche prendere informazioni sul tipo da dattiloscritto e applicarle a JavaScript. Anche se non usi mai dattiloscritto puoi ottenere il completamento del codice e la documentazione su tonnellate di API mentre digiti JavaScript.

Quindi alle tue domande

  • Nessun modo immediato per trovare il punto di ingresso di una funzione (diverso da una ricerca in testo semplice, che può quindi portare a una successiva ricerca di metodi più in alto nella gerarchia di chiamate, dopo due o tre dei quali hai dimenticato da dove hai iniziato)

Sembra risolto principalmente in VSCode?

  • I parametri vengono passati alle funzioni, senza modo di sapere quali proprietà e funzioni sono disponibili su quel parametro

Questo è risolto per molti IDE documentando il codice con commenti o dattiloscritti in stile JSDoc. Gli editor leggeranno i commenti e ti daranno lo stesso completamento a cui sei abituato

L'uso comune di funzioni anonime come callback, che spesso porta a uno spaghetto di percorsi di codice confusi, che non è possibile navigare rapidamente.

Come programmatore C # le funzioni anonime sono comuni anche lì e sono state aggiunte al C ++. Penso che questo sia qualcosa a cui devi solo abituarti.

Anche se i callback sono stati per lo più sostituiti con promesse e con asincrono / wait e se si dispone di un API che utilizza un callback è possibile avvolgerlo rapidamente per utilizzare una promessa e quindi utilizzare async / wait in modo che il problema scompaia.

E sicuramente, JSLint rileva alcuni errori prima del runtime, ma anche questo non è utile come avere linee ondulate rosse sotto il tuo codice direttamente nel browser.

Otterrai linee ondulate in Visual Studio Code. Non solo, ma se attivi l'integrazione di ESLint riceverai tonnellate di avvisi sorprendenti e / o errori evidenziati nel tuo editor. Più di quello che ho visto per altre lingue in realtà. La mia esperienza è che i linters per C / C # / Java sono stati codificati in modo piuttosto duro in quanto ESLint è sia configurabile in modo massiccio che estensibile in modo massiccio e come tali librerie popolari possono persino integrarsi per darti consigli e avvertenze sull'uso specifico delle librerie nell'editor. Qualcosa che non ho visto personalmente in altre lingue (anche se forse è comune ora anche per altre lingue?)

È anche il 2018 ed ES7 è la nuova norma in modo da ottenere class. Usa sempre la modalità rigorosa. Non usi mai vare usi sempre conste lete un sacco di cose che i programmatori C ++ / C # / Java hanno avuto difficoltà ad abituarsi a sparire. Attiva la no-undefregola in ESLint e scompaiono ancora più problemi

Detto questo, scopri come thisfunziona davvero e come funzionano davvero funzioni e metodi perché non è lo stesso di C ++ / C # / Java.

I miei primi 2-3 anni di JavaScript sono stato frustrato. Ad un certo punto, però, è scattato. Ho smesso di provare a forzarlo a diventare C ++ / C # / Java e ora mi sento frustrato tornare indietro quando cose che richiederebbero 15 righe in JavaScript ne prenderebbero 150 in quelle altre lingue.


-1

Se ti piacciono gli IDE e sei abituato a eclissare controlla Aptana come IDE per JavaScript. Penso che possa fare molto di quello che vuoi. (Odio personalmente gli IDE ma questa è una conversazione diversa).

Per quanto riguarda le funzioni anonime, trovo che siano le funzionalità più potenti di JavaScript e provare a lavorare in una lingua che non le possiede è a questo punto abbastanza doloroso.

Se vuoi qualcos'altro che può essere compilato in JavaScript, ci sono un sacco di opzioni, CofffeeScript, Clojure e GWT saltano tutti alla mente, ma ce ne sono altri.


2
Ho provato Aptana una volta, ed è davvero brutto. Non ha nemmeno il rientro automatico e distrugge tutte le impostazioni del progetto stabilite da altri editor di Eclipse, ad es. Colorazione e cose se uso Eclipse e Aptana nello stesso progetto.
Jonas,

1
L'ho usato per un po 'e lo odiavo, ma come ho detto odio gli IDE faccio formattazione con lo strumento da riga di comando e modifico in GVIM o emacs (a seconda di ciò che sto facendo)
Zachary K,

Si blocca nelle prime ore e non ho nulla di aperto a parte una manciata di file? Buh-bye.
Erik Reppen,

Il webstorm non è male. Uso ancora Scite per la maggior parte del tempo, ma sto iniziando a sentire di più la cosa IDE quando scrivo cose su Node.js e non ho il vantaggio del feedback del browser e degli strumenti di sviluppo visibili.
Erik Reppen,

-1

Non l'ho ancora usato da solo, ma ho visto alcune demo e sono rimasto molto colpito da Cloud 9 come IDE JavaScript.

Puoi scegliere il modello di servizio online o scaricarlo da GitHub.

E come prova della sua qualità di IDE, Cloud9 è stato scritto usando ... Cloud9!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.