Ho ereditato una grande pila di codice Ruby che è, francamente, quasi impossibile da capire per un mortale come me. In realtà è un codice di test unitario Rspec, ma la struttura è "molto insolita" per dirla in modo carino.Come posso registrare ogni metodo chiamato in un programma Ruby?
Quello che mi piacerebbe essere in grado di fare è eseguire il codice, e hanno le seguenti informazioni registrate da qualche parte:
- ogni metodo che viene richiamato, tra cui il nome della classe che definisce il metodo, e il nome del file in cui è stato definito il metodo invocato (sì, abbiamo la stessa classe/metodo definito in più file diversi ed è difficile sapere quale viene invocato)
- (facoltativamente) i parametri passati a ciascun metodo invocato
Con quello, potrei cominciare a provare a refactoring esso. Senza di esso, sarà molto difficile risolverlo a causa delle dimensioni del codice di base (20k + casi di test unitari).
Non posso permettermi di entrare ed eseguire le modifiche all'ingrosso al codice in esecuzione, perché si interrompe quando si usa persino un linguaggio aspro attorno ad esso (cioè spesso). Invece, ho bisogno di essere in grado di strumentare il codice nel suo stato esistente, o con modifiche minime a ciò che esiste ora.
C'è un modo per registrare questo livello di dettaglio senza apportare modifiche all'ingrosso al codice base? Ho dato un'occhiata al profiler di Ruby per vedere se poteva aiutare, e probabilmente potrebbe; Sono curioso di sapere se esiste un modo migliore (in particolare, registrare il nome file che contiene il metodo invocato).
Grazie in anticipo
Avete considerato un analizzatore statico o sono solo alla ricerca di qualcosa che in realtà esegue il codice? Doxygen emette alcuni simpatici grafici caller/callee, non ha guardato per vedere se supporta Ruby ma i call call possono rivelarsi molto utili per capire il codice esistente. –
Sono abbastanza sicuro che Doxygen non supporta Ruby - se così fosse, sarebbe sicuramente utile per me, ma non riesco a trovare alcuna informazione su Doxygen che supporta Ruby. Preferirei avere qualcosa che esegua effettivamente il codice, principalmente perché l'ordine in cui vengono elaborati i requisiti influenzerà quale delle molteplici (non identiche) definizioni di un dato metodo verrà utilizzata. Come ho detto, è una brutta base di codice ... – monch1962