2008-11-19 10 views
8

¿Alguien sabe cómo definir la refactorización de una manera más formal?¿Hay alguna definición formal para "refactorización"?

ACTUALIZACIÓN.

A refactorización es un par R = (pre; T) donde pre es la condición previa de que el programa debe satisfacer, y T es la transformación de programas.

+0

reabierto y upvoted - esta es una excelente pregunta –

+0

Lo que en la tierra es de aproximadamente ofensiva ¿esta? Una muy buena pregunta. – tvanfosson

+0

Las transformaciones razonables incluyen sus propias precondiciones, por lo que parece redundante en esta caracterización. –

Respuesta

-2

Bueno, no directamente, pero en términos de dinero, puedo decir que sí. No puedo proponer una ecuación sobre eso :)

El código bien escrito, sin complejidad (que podría deberse a la refactorización) puede ahorrar tiempo/esfuerzo y, por lo tanto, dinero.

3

Es una pregunta interesante y que no había considerado. Hice un poco de google y se me ocurrió este paper (PDF) en la refactorización en AOP que intenta aplicar algunos modelos matemáticos a los aspectos para mostrar que los aspectos funcionales tienen la misma flexibilidad que los aspectos tradicionales, pero con una complejidad reducida. No leí todo el documento, pero es posible que encuentres algo allí.

Otra idea interesante sería pensar en refactorizaciones en la misma línea que las optimizaciones del compilador. Esencialmente, el compilador refactoriza su código sobre la marcha, aunque con objetivos diferentes a la refactorización a nivel de código. Tendría que cuantificar de alguna manera la complejidad y la legibilidad del código de una manera razonable para demostrar cómo lo afecta una refacturación en particular. Venir con el modelo probablemente sería la parte difícil.

También encontré este paper que establece un álgebra de programación OO y deriva algunas leyes básicas, luego usa esas reglas básicas para derivar una refactorización más complicada.

Cosas interesantes. Espero que esto ayude.

+0

excelentes hallazgos! –

2

refactorización es una serie de transformaciones de corrección de preservación, pero refactorización puede resultar en código más general que el original

así que no podemos afirmar que una transformación refactorización T en el programa de P tiene las mismas propiedades R antes y después de refactorización, pero las propiedades R 'del programa refactorizado P' deben ser al menos equivalente a R

given program P implies R 
refactoring transformation T(P) produces P' 
where (P' implies R') and (R' is equivalent to or subsumes R') 

también podemos afirmar que las entradas y salidas siguen siendo los mismos o equivalente

pero para seguir su ejemplo, tal vez queremos definir una transformación de refactorización T como una P, I, O, R de 4 tuplas donde P es el programa original, I son las entradas y/o precondiciones, O son las salidas y/o poscondición, y R es el programa transformado, luego afirmar (usando la lógica temporal?) Que

P:I -> O 

mantiene antes de la transformación

T(P) -> R 

define la transformación, y

R:I -> O 

mantiene después de la transformación

mis matemáticas simbólico es oxidado, pero eso es una dirección general

esto haría que la tesis de un buen maestro, por cierto

+0

No. Un paso de refactorización puede cambiar la semántica del programa. Considere la posibilidad de descartar un argumento de una llamada a función. –

+0

@ [Ira Baxter]: sí, me refería a las entradas y salidas del programa P, no a una función individual dentro de P. Por supuesto, podría soltar una entrada al programa si no se usara, pero si no se usó 't usado entonces la semántica práctica (en oposición a la formal) del programa permanece sin cambios de todos modos ;-) –

2

Podría ser interesante observar que la mayor parte de los Refactorizaciones vienen en pares:

  • Agregar parámetro - Retire Parámetro
  • Extracto de Clase/Método - Inline/Método
  • tire hacia arriba de campo/Método de las Clases - Desplegables campo/Método
  • Cambio asociación bidireccional a unidireccional - Cambio asociación unidireccional a bidireccional
  • ...

La aplicación de las dos refactorizaciones del par es una transformación nula.

Para un par refactorización R, R ':

R' (R (código)) = código

Cuestiones relacionadas