2012-10-11 4 views
6

Sto riscontrando che alcuni tipi di pulizia del codice e di refactoring sono resi MOLTO difficili dalla difficoltà di aggiungere un'unità alle clausole di utilizzo di un grande progetto.Aggiunta di un'unità alle clausole di utilizzo di tutte le unità in un progetto?

Desidero aggiungere un'unità all'interfaccia-usa-clausola di tutte le unità delphi .pas in un singolo progetto e ciò significa eseguirla manualmente in oltre 500 posizioni. Ogni volta che refactoring un'unità gigante e lo divido da una unità in due, posso probabilmente cercare e sostituire usando qualcosa come "notepad ++" per cambiare "MyOldUnit", a "MyOldUnit, MyNewUnit", ma a volte, non è sicuro farlo . Manca anche i casi in cui "MyOldUnit" è l'ultima cosa nella clausola uses ("usa MyOldUnit;").

In ogni caso, la ricerca e la sostituzione in file sono attività pericolose. Se non esiste uno strumento simile, sto pensando di scriverne uno, usando il parser del Delfi di Castalia. Ho controllato GExperts, Castalia, ModelMakerCodeExplorer e nessuno di essi ha un modo per inserire in gruppo le unità in tutte le clausole di utilizzo in un progetto. Spero che esista uno strumento per farlo.

In secondo luogo, in molti casi, sto spostando una funzione da un'unità in cui non appartiene a un'altra, ma ciò significa che devo aggiungere quell'unità al 30% delle unità del progetto, ma non l'altra 70 % dove è già stato aggiunto. Ciò significa che è richiesto un approccio parser, non un approccio regex.

+2

C'è il (molto vecchio) 'JclUsesWizard' in JCL \ experts \ useswizard, forse può servire come punto di partenza. –

+0

Non hai bisogno di un parser reale per farlo. Solo uno script basato su regex che usa Perl o Python o quello che ti piace per gli script regex. Avresti bisogno di un vero parser se volessi qualcosa di robusto, ma per un'applicazione one shot alla tua base di codice, non lo fai. –

+4

Hai già provato CnPack? – kobik

risposta

3

Perché tutti scriviamo codice che utilizzeremo sicuramente in altri progetti. Se si spostano le parti dell'interfaccia da un'unità all'altra, si interromperanno i progetti. Lo stesso con le vecchie e le nuove unità.

Ma puoi refactoring senza rompere i tuoi progetti. Contrassegnare le parti (unità, classe, metodo, procedura) come deprecate. Il tuo codice funziona, ma sarai avvisato dal compilatore.

Ecco un esempio di spostamento di una procedura di da un'unità all'altra:

unit Foo; 

interface 

procedure FooProc; deprecated; // new location in unit FooNew 

implementation 

uses 
    FooNew; 

procedure FooProc; 
begin 
    FooNew.FooProc; 
end; 

end. 
+0

Questa è un'idea molto pratica. +1. –

Problemi correlati