Gestione dell'indirizzamento e mantenimento diretto di livelli di chiamate di metodo, oggetti e persino file xml

3

Come mantenere tutto dritto mentre si traccia in profondità in un pezzo di software attraverso chiamate a metodi multipli, costruttori di oggetti, fabbriche di oggetti e persino il cablaggio a molla. Trovo che 4 o 5 chiamate di metodo siano facili da tenere nella mia testa, ma una volta che vai a 8 o 9 chiamate in profondità diventa difficile tenere traccia di tutto. Ci sono strategie per mantenere tutto dritto?

In particolare, potrei cercare come eseguire l'attività x, ma quando rintraccio (o su) perdo la traccia di quell'obiettivo, o trovo che più livelli necessitano di modifiche, ma poi perdo la traccia di quali modifiche mentre risalgo fino in fondo. Oppure ho dei piani provvisori che scopro non sono validi ma poi durante il tracciamento dimentico che il piano non è valido e proverò a considerare lo stesso piano per tutto il tempo della morte ....

Esiste un software che potrebbe essere in grado di dare una mano? grep e anche eclissi possono aiutarmi a tracciare da una chiamata alla definizione, ma sono più preoccupato di tenere traccia di tutto, incluso il piano de-facto per ciò che deve cambiare (che potrebbe variare man mano che si va giù / su e rendersi conto che il piano precedente era scarso).

In passato mi sono occupato di alcuni grandi metodi che puoi rintracciare e praticamente riesco a capire cosa succede in poche chiamate. Ma ora ci sono dozzine di metodi veramente piccoli, molti solo una chiamata a un altro metodo / costruttore ed è difficile tenerne traccia.

    
posta Cervo 24.11.2011 - 17:15
fonte

3 risposte

1

Dopo aver parlato con altre persone al lavoro e scavando da solo, ho scoperto che la denominazione fa o rompe l'approccio di molti piccoli metodi, e alcuni credono che il tuo collega non sia pazzo. Il principio della sorpresa minima è molto importante.

Con più oggetti c'è più spazio per introdurre codice ed effetti collaterali. Se vuoi sorprendere qualcuno, più classi significano più costruttori (possibilmente blocchi di inizializzazione statici e altre strutture simili) e più variabili di istanza. Se vuoi nascondere il codice e offuscarlo, più oggetti sicuramente ti aiutano. Mentre ogni singolo metodo e persino oggetto possono essere semplici, la loro grande somma tende ad essere più complessa. Inoltre se hai qualcosa come Spring che può anche introdurre effetti logici / collaterali aggiuntivi che hanno a che fare con il codice, è anche peggio ......

Anche nominare. Un problema che ho riscontrato è spesso un metodo che dice DoesX, ma in realtà il metodo fa x, y, z, a, b, c. Quindi ho difficoltà a ragionare su cosa fa qualsiasi codice. In pochi metodi giganti, osserveresti i metodi e vedrai un mucchio di codice che fa cose inaspettate che i tuoi occhi potrebbero notare ed essere come il WTF. Probabilmente dovresti individuare il codice per y, z, a, b, c. Leggendo gli oggetti split leggerai il codice che dice DoesX e prima supponi che faccia X. Poi più tardi quando ancora non capisci cosa sta succedendo e inizi a leggere tutto ciò che alla fine arrivi a DoesX e vedi oh sta facendo y, z, a ,avanti Cristo. Ma se i metodi sono denominati correttamente, allora le cose funzionano meglio perché spesso puoi capire cosa sta succedendo senza nemmeno leggere i metodi. Se DoesX fa semplicemente X, puoi andartene senza leggerlo a meno che X non sia rotto.

Ho notato che sebbene usiamo Java, e tramite il cablaggio Spring qualsiasi oggetto può essere realmente collegato a un'interfaccia, tendono a saltare tra le classi usando la navigazione di Eclipse. Se c'è un'interfaccia, tendono a usare eclissi per mostrare tutte le implementazioni (generalmente solo 1) e poi saltare ad essa. In realtà, Spring potrebbe implementare un'implementazione da qualche altra libreria o fare qualcosa che non ti aspetti (cosa che in pochissimi casi accade), ma in generale si basano solo su cose da fare nel modo previsto. Ho persino trovato un'estensione di implementazione aperta per farmi fare clic su un metodo su un'interfaccia e passare automaticamente alla versione della classe di implementazione. Ancora alcuni posti sono un disastro e non funzionano come previsto. Ma quelli sono generalmente considerati codici errati e candidati per una riscrittura. Inoltre ci sono alcune tecniche di progettazione che sono conoscenze comuni in azienda, quindi riconoscere queste tecniche aiuta anche a capire. Non sono documentati da nessuna parte, ma dopo essere stati come il WTF e averli letti, vedo di nuovo la stessa tecnica e la riconosco immediatamente. Ancora una volta ... qualcuno potrebbe fare cose inaspettate per pasticciare con te.

Martin Vejmelka è una sorta di test unitario menzionato come un modo per sapere che il codice sta funzionando bene. Ho intervistato in un luogo che utilizzava test unitari come questo, come modi per affermare il codice che stava facendo. Quando si eseguiva il debug della propria tecnica, era necessario pensare a quali asserzioni dovevano essere errate perché il comportamento si verificasse, quindi creare test unitari con il comportamento previsto che non riesce, quindi correggerli. Al mio posto attuale hanno dei test unitari ma non coprono tutto il codice, e soffrono anche di enormi quantità di indirezione, rendendo la lettura dei test unitari impegnativa come leggere il codice, e talvolta anche più difficile.

    
risposta data 21.07.2012 - 22:35
fonte
0

Se il tuo progetto è coperto da test unitari e test di integrazione, non dovresti aver bisogno di tenere tutto il quadro in mente.

Utilizzando lo sviluppo basato su test e le pratiche di XP - metodi ben denominati (nomi semantici), dovresti lavorare facilmente ad ogni livello di astrazione.

Nel caso in cui sia necessario aggiungere nuove funzionalità al progetto, è sufficiente scrivere nuovi test e provare a far funzionare il test il più rapidamente possibile. Se non è possibile aggiungere la funzionalità (per qualche motivo strutturale - punti di estensione non accessibili ...), rifatta il codice (controlla ripetutamente le modifiche non freni il codice che esegue la tua suite di test).

Cerca di fornire i nomi semantici dei casi di test:

@Test
public void shouldReturnSumOfSuppliedNumbers() {
     // test code here
}

ti darà più informazioni di:

@Test
public testSum() {
     // test code here
}
    
risposta data 24.11.2011 - 18:36
fonte
0

Tendo ad avere un foglio di carta (il retro prima che vada nel riciclatore) parzialmente tenuto dalla mia tastiera che scarabocchiai gli appunti, e gli stack di chiamate vengono scaricati anche lì - in forma abbreviata.

Potresti riuscire a fare in modo che se le tue pile di chiamate continuassero per 10, 20 o anche 30 chiamate di metodo, allora hai un casino nelle mani. È necessario rendere gli oggetti molto più chiari, in modo da poter saltare pezzi dello stack di chiamate come "ovvi" e quindi inutili da ricordare. (ad esempio, non hai davvero bisogno di entrare nell'assembly quando aggiungi 2 inte insieme, ti fidi che funzioni).

    
risposta data 22.07.2012 - 00:15
fonte

Leggi altre domande sui tag