Come visualizzare il codice? [chiuso]

107

Per lo più ho dovuto solo leggere il mio codice. Come tale, non ho avuto bisogno di visualizzare il codice perché so già come ogni classe e modulo comunicano tra loro.

Ma le poche volte che ho dovuto leggere il codice di qualcun altro - supponiamo ora che stiamo parlando di almeno un modulo più grande che contiene diverse classi interne - Mi sono quasi sempre trovato a desiderare "Questo sarebbe sono stato molto più facile da capire se potessi visualizzarlo! "

Quindi quali sono i metodi o gli strumenti comuni per abilitare questo? Che usi e perché preferisci gli altri rispetto agli altri? Ho sentito cose come UML, moduli e diagrammi di classe, ma immagino ci siano altri. Inoltre, ognuno di questi è molto probabilmente migliore di qualsiasi cosa io possa ideare da solo.

EDIT: per coloro che rispondono con "Usa carta e penna e disegnalo semplicemente": questo non è molto utile se non lo spieghi ulteriormente. Cosa esattamente dovrei disegnare? Una scatola per ogni classe? Devo includere i metodi pubblici? E i suoi campi? Come dovrei disegnare connessioni che spieghino come una classe usa un altro? E i moduli? Cosa succede se il linguaggio non è orientato agli oggetti ma funzionale o logico, o anche solo imperativo (C, per esempio)? Che dire delle variabili e delle funzioni globali? Esiste un modo già standardizzato di disegnare questo, o ho bisogno di pensare a un metodo tutto mio? Ottieni la deriva.

    
posta gablin 06.10.2010 - 10:59
fonte

17 risposte

24

Mi piace usare NDepend per eseguire il reverse engineering della base di codice .NET complessa. Lo strumento è dotato di numerose fantastiche funzioni di visualizzazione come: Ci sono decine di modi per visualizzare un codice base e per completare la risposta Pierre_303, ecco un po 'di screenshot estratto da NDepend (dichiarazione di non responsabilità, io sono il creatore di NDepend).

Grafico delle dipendenze : un grafico può rappresentare diversi tipi di interazione nel codice, più documentazione qui (Grafico di interazione, Grafico delle chiamate, Grafico di ereditarietà delle classi, Grafico dei percorsi, Grafico dei cicli ...)

Matricedidipendenza:rappresentalestesseinformazionidiungraficomainunmodocompletamentediverso.MatrixèmegliodiGraphpervisualizzaregrandidipendenzeimpostateconcentinaiadinodiespigoli,mentreGraphèmegliodiMatrixpersetdidipendenzepiùpiccole,inparticolareconmenodi20nodi.Matrixhaancheunimmensovantaggionelmostrareilmodellostrutturaledelcodiceacolpod'occhio,comecodicestratificato,ciclodidipendenza,coesione,accoppiamento...Maggioriinformazioni qui .

Visualizzazionemetricadelcodicetramitetreemaping:nonsitrattadimostrarelastruttura/l'architetturadelcodice,mapiùcomeilcodiceèpartizionato.Quiirettangolimostranometodi,classiespazideinomi,epiùlineedicodicehaunaclasse,piùgrandeèilsuorettangolo.Scegliendounacombinazioneappropriatadimetricadelcodiceevaloridilivello,laVistametricadiTreemapaiutaavedereipatternchesarebbedifficileindividuareconaltrimodi.Ulterioriinformazioni qui .

    
risposta data 26.11.2010 - 18:57
fonte
21

In qualunque modo tu lo capisca meglio. Se sei un pensatore visivo, come disegnerebbe il codice che puoi visualizzare? Per quanto mi riguarda, abbozzo diagrammi di flusso, o diagrammi di database / UML. una volta che hai un modo di rappresentare il codice, prova a leggere il codice esistente e ad abbozzarlo mentre lo leggi.

    
risposta data 05.10.2010 - 23:06
fonte
15

Doxygen è utile per generare diagrammi di classe ed esplorare le classi tramite collegamenti ipertestuali. Funziona anche se il codice non è specificamente aumentato con i commenti in stile Doxygen.

    
risposta data 06.10.2010 - 20:22
fonte
11

Inoltre, dai un'occhiata a Signature Survey di Ward Cunningham. È leggero e semplice, ma sorprendentemente utile per dare un'idea della dimensione e della complessità delle parti del codice base.

Originariamente l'ha fatto per Java, ma puoi sempre adattarlo alla lingua in cui lavori. Recentemente l'ho fatto con VB (aggiungendo alcune aggiunte personali) ed è stato molto utile. Ecco un esempio dell'aspetto dell'output:

(ti consigliamo di fare clic con il pulsante destro del mouse - > visualizzare l'immagine, quindi assicurati di essere ingrandito)

    
risposta data 26.11.2010 - 19:51
fonte
10

UML diagrammi di classe per struttura e diagrammi di sequenza per comportamento (UML offre più tipi di diagrammi per questi due scopi, tutti incentrati su aspetti diversi del software - questi sono i due che trovo particolarmente utili e li disegno / li creo quando è necessario perché aiutano molto).

    
risposta data 05.10.2010 - 23:36
fonte
10

Se il codice è suddiviso in livelli, puoi visualizzare facilmente il codice semplicemente disegnando i livelli in dettaglio.

Prendiamo ad esempio Android:

Questo è il tipo di diagramma più comune che è davvero facile da disegnare. Per renderlo utile, tuttavia, è sufficiente iniziare a disegnare linee per rappresentare il flusso di dati. In questo esempio è possibile tracciare un'applicazione da XMPP a SSL al driver Bluetooth o qualsiasi altra combinazione.

Consiglierei comunque di approfondire un po '. Dal momento che la maggior parte dei progetti non è grande come Android, puoi rendere le cose un po 'più semplici e fare in modo che ogni scatola sia una classe o un metodo che rende più facile scrivere il codice in un secondo momento.

    
risposta data 06.10.2010 - 19:35
fonte
6

Ti suggerisco di dare un'occhiata a strumenti come nDepend: link

NDepend is a Visual Studio tool to manage complex .NET code and achieve high Code Quality. With NDepend, software quality can be measured using Code Metrics, visualized using Graphs and Treemaps, and enforced using standard and custom Rules.

Hence the software design becomes concrete, code reviews are effective, large refactoring are easy and evolution is mastered.

    
risposta data 05.10.2010 - 23:49
fonte
6

Se possiedi un buon debugger e sei bravo a usarlo, puoi passare al codice, fermarlo, passare il mouse sopra gli oggetti e vedere il loro stato, ecc. In sostanza, puoi scorrere il codice mentre è in esecuzione. Trovo che questo mi aiuti a ricucire mentalmente i vari oggetti e come interagiscono tra loro.

    
risposta data 06.10.2010 - 00:06
fonte
5

Dipende dalla parte in cui mi trovo in difficoltà.

  • Se ci sono troppe classi tutte che parlano l'una con l'altra le disegna come scatole e disegno linee / frecce tra di loro per vedere chi parla con chi.
  • Se ci sono chiamate di funzioni nidificate e ho bisogno di capire chi dipende da chi faccio qualcosa di simile ai diagrammi di sequenza.
  • Quando si tratta della logica in sé, faccio due cose. Uno è immaginare il layout dei dati e seguire nella mia mente il modo in cui viene manipolato mentre il codice è in esecuzione, e due sono costruendo una "immagine mentale" della logica. Non so davvero cosa sia questa immagine mentale, perché in realtà non la immagino, più come sentire la sua "qualità spaziale" nello stesso modo in cui immaginare una mappa ti aiuta a capire cosa ti circonda.
risposta data 06.10.2010 - 20:24
fonte
5

Se utilizzi Java o Smalltalk, dovresti assolutamente verificare Città codici . Ti consente di utilizzare la parte del tuo cervello che ha familiarità con la navigazione delle città per ottenere istantaneamente una prospettiva completamente nuova sulla base di codice! Mi è sicuramente venuto in mente quando l'ho usato per la prima volta.

    
risposta data 26.11.2010 - 19:50
fonte
5

MS Research ha pubblicato Debugger Canvas per Visual Studio 2010

    
risposta data 24.12.2011 - 18:35
fonte
3

Non visualizzo abbastanza, ma trovo che passare attraverso diversi casi d'uso è un modo davvero utile per visualizzare il modo in cui le diverse classi interagiscono. Questo è particolarmente utile quando hai un sacco di piccole classi e può essere travolgente per cercare di capirle tutte insieme.

Scrivi un test che avvii il tuo caso d'uso e attiva il debugger, quindi traccia il flusso delle interazioni di classe. Ciò è particolarmente utile quando si va oltre il singolo progetto, in quanto è possibile vedere quali altri progetti vengono utilizzati. A seconda della complessità, un diagramma di stato farebbe il trucco.

    
risposta data 05.10.2010 - 23:14
fonte
3

SO sembra avere una discussione parallela con una serie di link di strumenti software: link

Ma anche, la domanda è troppo generica per ottenere una buona risposta. In quale lingua è il codice. Se è qualcosa di tipicamente, ecc. Come Java, ci sono strumenti per analizzare / convertire / visualizzare la struttura della classe, i collegamenti incrociati, ecc. Se è più dinamico come Ruby, potresti avere molto più problemi.

Se è di pubblico dominio, spesso ci sono siti specializzati nella ricerca e nella navigazione attraverso il codice. Linux ne ha sicuramente uno, come esempio.

Inoltre, puoi eseguire il codice o puoi solo leggerlo? Se riesci a eseguirlo, prova ad inserire un dump del thread (o equivalente non Java) nelle posizioni per cui sei confuso. Questo ti mostrerà quale percorso ha preso il programma per arrivarci. In caso di problemi a capire quali file di configurazione sono caricati e quando si guarda qualcosa come ProcessMonitor da Sysinternals / Microsoft. Per l'analisi del comportamento della rete, è possibile utilizzare Wireshark. In generale, è possibile utilizzare tecniche di risoluzione dei problemi. Per Java, ho fatto una presentazione su un po 'di tempo fa per JavaOne / InfoQ: link

Infine, prova a cercare gli strumenti di analisi del codice sorgente, spesso includono i componenti di visualizzazione.

    
risposta data 23.05.2017 - 13:33
fonte
3

In Visual Studio, puoi fare clic con il pulsante destro del mouse su un progetto o file e fare clic su "genera diagramma di classe". A volte appaiono disordinati ma spesso utili quando si hanno molte interazioni.

Mi piacerebbe vedere un qualche tipo di editor visuale che fornisca una rappresentazione logica del codice e ti permetta di modificarlo attraverso questo, piuttosto che il codice - probabilmente esiste già.

    
risposta data 04.04.2014 - 15:49
fonte
2

AgileJ StructureViews è costruito esattamente per la situazione che descrivi - volendo una versione visiva di una base di codice di grandi dimensioni scritta da altre persone. Il solito problema con i diagrammi di classe UML in reverse engineering è che i risultati contengono così tanti dettagli che non si sta molto meglio di una semplice lettura del codice. AgileJ è grande sul filtraggio. Sotto il diagramma delle classi c'è uno script di filtro che modifichi per abbattere i membri che vengono visualizzati. AgileJ è anche grande sulla generazione di diagrammi batch. Puoi avviare un batch e cercherà gruppi di classi correlate per formare diagrammi che puoi sfogliare per vedere la struttura.

    
risposta data 06.07.2012 - 14:05
fonte
1

Quando si codifica, si ottengono le esigenze da una vista completa e si rompe in piccoli pezzi e si inizia a disegnare, disegnare e codificare. Dopo questo, si uniscono le parti e si ottiene il risultato completo.

Per capire il codice non creato da te, è necessario eseguire lo stesso processo. In questo processo puoi usare gli schemi se ne hai. Inizia con casi d'uso, visualizzazione di componenti e sottosistemi e termina con diagrammi di classe in cui l'obiettivo è la vista logica per comprendere relazioni e responsabilità, non attributi / metodi.

Dopodiché, inizi a studiare diagrammi dettagliati delle classi o vai direttamente al codice. Penso che i diagrammi sequenziali siano poco confusi, preferisco guardare il codice.

Penso che UML non sia ancora una forma ideale, ma è uno standard che molte persone conoscono ed è facile da condividere e capire.

Se non hai una documentazione UML, puoi utilizzare il reverse engineering, ma avrai bisogno di aiuto per capire alcune cose.

    
risposta data 06.10.2010 - 00:23
fonte
1

Uso EclipseUML Omondo per navigare nel codice a livello di modello. Veramente cool !! Per prima cosa inverto il mio progetto java per mapparlo al modello UML. Quindi creo viste del mio modello rilevando associazioni, dipendenze, eredità ecc ... mostra e nasconde ciò di cui ho bisogno. Posso creare il maggior numero di diagrammi di cui ho bisogno basandomi su un singolo modello mappato su Java.

Il trucco utilizzato da Omondo è mappare gli ID Java e UML e sincronizzarli direttamente con il metamodello UML. Tecnologia meravigliosa e davvero sorprendente per visualizzare il mio codice.

    
risposta data 13.10.2010 - 17:19
fonte

Leggi altre domande sui tag