Domanda

Sono pazzo della colorazione della sintassi, in cui diversi elementi del codice sorgente vengono visualizzati in diversi colori. Al giorno d'oggi, una buona colorazione è proprio lì con il rientro corretto quando si tratta della mia capacità di leggere il codice.

Dando un'occhiata a Strumenti / Personalizza / Caratteri e colori , posso vedere che in alcuni casi c'è una granularità fine; puoi dare colori diversi alle stringhe e stringhe testuali, ad esempio.

Ma ecco una tipica riga di codice C #:

Controls.Add(combo);

Ora Controlli, Aggiungi e combo sono tutti diversi tipi di cose, eppure sono tutti resi nello stesso colore, perché sono tutti solo "identificatori".

Sicuramente c'è un modo per ottenere più granularità di quello? Almeno i metodi di colore in modo diverso rispetto agli oggetti?

È stato utile?

Soluzione

Alcuni pensieri.

Innanzitutto, le funzioni non sono "quotate" e non implementate per impostazione predefinita. Per poter implementare una funzione, qualcuno deve pensare alla funzione. Quindi dobbiamo progettarlo, specificarlo, implementarlo, testarlo, documentarlo, trovare un veicolo per la spedizione e farlo uscire dalla porta. Se una di queste cose non accade, non si ottiene la funzione. Per quanto ne so, NESSUNO di queste cose è successo per questa funzione.

In secondo luogo, le funzionalità sono prioritarie in base ai loro vantaggi netti, ovvero al loro beneficio totale per i nostri clienti, meno i nostri costi totali per la loro implementazione. Ci sono costi di opportunità molto reali in gioco qui. Ogni funzione che implementiamo è dozzina di funzionalità per le quali non abbiamo budget. Quindi le funzionalità non devono solo valere il lavoro necessario per realizzarle, ma devono essere PIÙ vantaggiose rispetto a una qualsiasi delle migliaia di funzionalità presenti nei nostri elenchi di richieste di funzionalità. Questo è un alto livello da raggiungere; la maggior parte delle funzionalità non lo raggiunge mai.

Per spiegare il mio terzo punto devi sapere un po 'su come vengono elaborate le lingue. Iniziamo prendendo il codice sorgente e "lexing" in "token" - parole. A questo punto sappiamo se ogni carattere fa parte di un numero, stringa, parola chiave, identificatore, commento, direttiva preprocessore e così via. Lexing è incredibilmente veloce ; possiamo facilmente ri-lessare un file tra i tasti.

Quindi prendiamo la serie di token e "parse" li in un "albero di sintassi astratto". Questo determina quali parti del codice sono classi, espressioni, dichiarazioni di variabili locali, nomi, assegnazioni, qualunque cosa. Anche l'analisi è veloce, ma non veloce come il lessismo. Facciamo alcuni trucchi, come saltare l'analisi dei corpi del metodo fino a quando qualcuno non li sta effettivamente osservando.

Infine, prendiamo l'albero di sintassi astratto e facciamo un'analisi semantica su di esso; questo determina se un determinato nome fa riferimento a un tipo, una variabile locale, uno spazio dei nomi, un gruppo di metodi, un campo e così via. Facciamo entrambi "top level" analisi semantica, per determinare la gerarchia dei tipi del programma e "livello di metodo" analisi semantica, per determinare il tipo di ogni espressione in ogni metodo. " Livello superiore " l'analisi semantica è piuttosto veloce e qualsiasi analisi dei singoli metodi è piuttosto veloce, ma è comunque difficile fare un'analisi semantica completa tra i tasti premuti.

Ovviamente dobbiamo fare un'analisi semantica completa per l'intellisense, ma possiamo fare a meno di capire quale metodo stai attualmente digitando e fare solo l'analisi semantica del livello superiore e di quel metodo.

Ma la colorazione deve funzionare sull'intero file; non puoi semplicemente colorare il metodo in cui si trova il cursore in questo momento. Pertanto, la colorazione deve essere follemente veloce, quindi storicamente abbiamo colorato principalmente sulla base di informazioni lessicali.

Occasionalmente possiamo capire cose speciali come " questa cosa è probabilmente un tipo? " per dargli un colore diverso. Ma capire quando una data entità è, per esempio, un gruppo di metodi vs, per esempio, un campo di tipo delegato, richiede un livello piuttosto ricco di analisi semantica, un livello che attualmente non eseguiamo ad ogni sequenza di tasti.

Ora, ci sono cose che possiamo fare qui. Potremmo essere più intelligenti nel comprendere le modifiche al flusso di token e solo riformulare l'analisi grammaticale e semantica sulla parte modificata dell'albero. Stiamo facendo delle ricerche in quest'area ora, ma sono solo ricerche; potrebbe non trasformarlo mai realmente nel prodotto.

Altri suggerimenti

Credo che il plug-in ReSharper offra alcuni evidenziatori della sintassi migliorata di cui stai parlando. Potrebbero esserci anche altri plugin che forniscono la stessa cosa (a un costo inferiore) che è semplicemente quello che uso. Sono d'accordo che l'evidenziazione della sintassi è molto utile. ReSharper fa anche alcune cose carine come gray out dead code per renderlo più ovvio, evidenziare la riga corrente, ecc.

-Daniel

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top