2012-06-19 4 views
10

Ho una grande base di codice che sto lavorando con il quale ha unità di questo tipo:C'è qualche strumento o componente aggiuntivo per Delphi che posso usare per aiutare il codice refactor che non è orientato agli oggetti?

unit myformunit; 

interface 
type 
    TMyForm = class(Form) 
    end; 

    procedure not_a_method1; 

    procedure not_a_method2; 

    var 
    global1,global2,global3:Integer; 
    ... 

In breve, del codice gli autori non hanno scritto i metodi, hanno scritto procedure globali. Ce ne sono decine di migliaia. All'interno di queste procedure, fanno riferimento a una singola istanza di MyForm:TMyForm.

Sto pensando di scrivere un'utilità di parser/rewriter che trasformerà questo codice in "codice almeno minimamente orientato agli oggetti". La strategia è quella di spostare l'interfaccia e le sezioni globali di implementazione nel modulo, come inizio. Mi rendo conto che non è elegante OOP. Ma è un passo avanti rispetto ai globali.

Se potessi farlo su una unità alla volta, potrei essere in grado di riparare la rottura nel resto del progetto, se l'ho fatto solo su un modulo alla volta. Ma mi piacerebbe ridurre la quantità di tempo necessaria per riscrivere le unità, invece di farlo a mano. Alcune forme hanno oltre 500 procedure e oltre 500 interfacce e implementazioni globali variabili che sono in effetti specifiche dello stato di una singola istanza del modulo in cui si trovano nella stessa unità.

Fondamentalmente, cosa farò se non esiste nulla di simile è scrivere un parser basato sul parser di Castalia Delphi. Spero che forse ModelMakerCodeExplorer, o castalia, o qualche altro strumento simile abbia qualcosa che possa almeno fare parte di quello che mi serve per me, quindi non devo costruire da solo questa utility. Anche se dovessi costruirlo da solo, penso che potrebbe automatizzare da mille a duemila ore di lavoro per me. Posso almeno eseguirlo, e poi vedere quante pause, e poi ripristinare o eseguire il commit dopo aver deciso di eseguire un refactoring su questo codice.

Strategie alternative che raggiungono lo stesso obiettivo (passare da zero incapsulamento e zero OOP, a più incapsulamento e leggermente più di zero OOP, in modo incrementale, su una base di codice delphi grande e non strutturata che utilizzava solo oggetti quando era inevitabile, e non ha mai avuto alcuna idea di OOP reale) sono i benvenuti.

+5

Avendo attraversato qualcosa di simile, tutto quello che posso dire è, buona fortuna, ne avrai bisogno. :( –

+0

Ottima domanda e scenario, penso solo che 1-2K ore (circa 40 giorni non-stop) è probabilmente un po 'più di quanto potrebbe probabilmente fare.Ho fatto * un po' * Pascal/dfm parsing prima e con la destra strumenti, in realtà non è così difficile, sto cercando di trovare quello che ho usato per questo in questo momento, ma credo che fosse sulla falsariga di "Gold Parser" che può avere un add-on esplicitamente per Pascal ... http: //www.goldparser.org/engine/1/delphi/index.htm –

+0

In realtà, i loro "Grammars" includono uno per Delphi 7 in particolare –

risposta

1

Cambiare i globali per formare campi sembra semplicemente tagliarli e incollarli. Potresti considerare di spostarli in una procedura fittizia e utilizzare MMX per normalizzare prima le dichiarazioni.

Quindi utilizzare CodeMaker Code Explorer per spostare le procedure e le funzioni nel modulo, che è solo tagliato e incollato nella Vista membro.

Non necessario, ma come passaggio successivo rimuovere i riferimenti all'istanza del modulo dai corpi del metodo. Questo può essere ottenuto trovando e sostituendo.

Oppure mi sono perso qualcosa?

+0

Non è il taglia e incolla ho bisogno di aiuto con tanto quanto il refactoring che dovrebbe verificarsi. Immagina che 10.000 globali siano passati da unitnamespace.globalname a unitnamespace.GlobalInstance.globalname. Ora esegui una modifica della sincronizzazione attraverso l'intero progetto e aggiorna tutti i riferimenti che sono stati compilati correttamente. Se il modellista MMX farà una correzione globale su quei riferimenti globali, allora è il mio salvatore. –

0

Il Delphi Sonar plugin (open source) non risolve il codice, ma può essere utilizzato e configurato per la ricerca di 'codice cattivo':

Il plugin Delphi Sonar consente l'analisi di progetti scritte utilizzando Delphi o Pascal. È stato testato con progetti scritti in Delphi 6, 7, 2006 e XE. Questo plugin è una donazione di Sabre Airline Solutions.I suoi test includono: Conteggio di righe di codice, istruzioni, numero di file, classi , pacchetti, metodi, accessor, API pubbliche (metodi, classi e campi), rapporto commenti, CPD (duplicazione codice, quante righe, blocco e in quanti file), complessità del codice (per metodo, classe, file, distribuzione della complessità su metodi, classi e file), LCOM4 e RFC, rapporti sui test unitari, regole, rapporti sulla copertura del codice, codice sorgente evidenzia per unità test, riconoscimento codice "Dead", riconoscimento file inutilizzati .

+2

Posso semplicemente segnalare la lunghezza del file e dire "175.000 righe nel file .pas, 175.000 righe di codice errato", in questo caso. :-) –

Problemi correlati