2012-06-19 12 views
10

tengo una gran base de código que trabajo con el que cuenta con unidades como esta:¿Hay alguna herramienta o complemento para Delphi que pueda usar para ayudar a refactorizar código que no esté orientado a objetos?

unit myformunit; 

interface 
type 
    TMyForm = class(Form) 
    end; 

    procedure not_a_method1; 

    procedure not_a_method2; 

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

En resumen, los autores del código no escribir métodos, escribieron los procedimientos globales. Hay decenas de miles de ellos. Dentro de estos procedimientos, hacen referencia a una sola instancia de MyForm:TMyForm.

Estoy considerando escribir una utilidad de analizador/reescritura que convertirá este código en "al menos un código mínimamente orientado a objetos". La estrategia es mover los elementos globales de la interfaz y la implementación al formulario, como un comienzo. Me doy cuenta de que no es muy elegante OOP. Pero es un paso adelante de los globales.

Si pudiera hacer esto en una unidad a la vez, podría reparar la rotura en el resto del proyecto, si solo lo hiciera en un formulario a la vez. Pero me gustaría reducir el tiempo que lleva reescribir las unidades, en lugar de hacerlo a mano. Algunas formas tienen más de 500 procedimientos y más de 500 variables globales de interfaz e implementación que, de hecho, son específicas del estado de una instancia única de la forma en que se encuentran en la misma unidad.

Básicamente, lo que haré si nada de esto existe es escribir un analizador basado en el analizador Castalia Delphi. Espero que quizás ModelMakerCodeExplorer, o castalia, o alguna otra herramienta similar tenga algo que al menos haga parte de lo que necesito para mí, así que no tengo que construir esta utilidad yo mismo. Incluso si tengo que construirlo yo mismo, estimo que podría automatizar entre mil y dos mil horas de trabajo pesado para mí. Al menos puedo ejecutarlo, y luego ver cuánto se rompe, y luego revertir o comprometerme después de haber decidido un nivel de esfuerzo para refactorizar este código.

estrategias

alternativos que logran el mismo objetivo (ir de cero encapsulación y cero programación orientada a objetos, a más de encapsulación, y un poco más que cero programación orientada a objetos, de manera incremental, sobre una base de código de Delphi grande, no estructurada que sólo utiliza objetos cuando estaba inevitable, y nunca tuvo ninguna idea acerca de OOP real) son bienvenidos.

+5

Después de haber pasado por algo similar, todo lo que puedo decir es, buena suerte, lo necesitarás. :( –

+0

Gran pregunta y escenario, solo creo que 1-2K horas (aproximadamente 40 días sin parar) es probablemente un poco más de lo que probablemente podría tomar. He hecho * algún * análisis pascal/dfm antes y con la derecha herramientas, en realidad no es tan difícil. Estoy tratando de encontrar lo que usé para eso ahora, pero creo que fue en la línea de "Gold Parser" que puede tener un complemento explícitamente para Pascal ... http: //www.goldparser.org/engine/1/delphi/index.htm –

+0

En realidad, sus "Gramáticas" incluyen una para Delphi 7 en particular –

Respuesta

1

Cambiar los globales para formar campos parece como cortarlos y pegarlos. Puede considerar moverlos en un procedimiento ficticio y usar MMX para normalizar las declaraciones primero.

A continuación, utilice ModelMaker Code Explorer para mover los procedimientos y funciones al formulario, que solo se corta y pega en la Vista de miembros.

No es necesario, pero como paso siguiente, elimine las referencias a la instancia del formulario de los cuerpos del método. Esto se puede lograr buscando y reemplazando.

¿O me perdí de algo?

+0

No es cortar y pegar Necesito ayuda con tanto como la refactorización que tendría que ocurrir. Imagine que 10,000 globales se movieron de unitnamespace.globalname a unitnamespace.GlobalInstance.globalname. Ahora haga una edición sincronizada a través de todo el proyecto y actualice todas las referencias que solían compilarse correctamente. Si modelmaker MMX hará una corrección global en esas referencias globales, entonces es mi salvador. –

0

El Delphi Sonar plugin (código abierto) no se resuelve el código, pero se pueden utilizar y configurar para buscar 'código malo':

El plug-in Delphi sonar, permite realizar análisis de los proyectos escritos utilizando Delphi o Pascal. Fue probado con proyectos escritos en Delphi 6, 7, 2006 y XE. Este complemento es una donación de Sabre Airline Solutions.Sus pruebas incluyen: recuento de líneas de código, declaraciones, número de archivos, clases, paquetes, métodos, descriptores de acceso, API pública (métodos, clases y campos), proporción de comentarios, CPD (duplicación de código, cuántas líneas, bloquear y en cuántos archivos), complejidad de código (por método, clase, archivo ; distribución de complejidad sobre métodos, clases y archivos), LCOM4 y RFC, informes de pruebas unitarias, reglas, informes de cobertura de código, código fuente resaltar para unidad pruebas, reconocimiento de código "muerto", reconocimiento de archivos no utilizados .

+2

Puedo simplemente informar la longitud del archivo y decir "175,000 líneas en el archivo .pas, 175,000 líneas de código incorrecto", en este caso. :-) –

Cuestiones relacionadas