2008-11-19 18 views
8

Quelqu'un sait comment définir le refactoring de manière plus formelle?Existe-t-il une définition formelle de "refactoring"?

MISE À JOUR.

A refactoring est une paire R = (pre; T) où est la condition préalable que le programme doit satisfaire, et T est la transformation du programme. Eh bien non pas directement, mais en termes d'argent - je peux dire oui.

+0

rouverte et upvoted - c'est une excellente question –

+0

Que diable est insultant ce? Une très bonne question – tvanfosson

+0

Les transformations résonables incluent leurs propres conditions préalables, il semble donc redondant dans cette caractérisation. –

Répondre

-2

Je ne peux pas trouver une équation là-dessus :)

Le code bien écrit, sans complexité (qui pourrait être dû au refactoring) peut économiser du temps/effort et donc de l'argent.

3

C'est une question intéressante et une que je n'avais pas envisagée. J'ai fait un peu de googling et est venu avec ce paper (PDF) sur refactoring dans AOP qui tente d'appliquer une modélisation mathématique à des aspects pour montrer que les aspects fonctionnels ont la même flexibilité que les aspects traditionnels, mais avec une complexité réduite. Je n'ai pas lu tout le papier, mais vous pourriez trouver quelque chose là-bas.

Une autre idée intéressante serait de penser à refactorings dans le même sens que les optimisations de compilateur. Essentiellement, le compilateur refactorise votre code à la volée, mais avec des objectifs différents de refactoring au niveau du code. Vous devez quantifier la complexité et la lisibilité du code d'une manière raisonnable pour montrer comment un refactoring particulier l'affecte. Venir avec le modèle serait probablement la partie la plus difficile.

J'ai également trouvé ce paper qui établit une algèbre de programmation OO et dérive quelques lois de base, puis utilise ces règles de base pour dériver un refactoring plus compliqué.

Intéressant. J'espère que cela t'aides.

+0

d'excellentes trouvailles! –

2

refactoring est une série de transformations préservant l'exactitude, mais refactoring peut donner lieu à plus code général que l'original

nous ne pouvons pas affirmer simplement qu'une transformation de refactoring T sur le programme P a les mêmes propriétés R avant et après refactoring, mais les propriétés R « du programme refondus P » devrait être au moins équivalente à R

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

nous pouvons affirmer que les entrées et les sorties restent les mêmes ou équivalent

mais pour suivre votre exemple, nous voulons peut-être définir une transformation de refactoring T comme un 4-tuple P, I, O, R où P est le programme original, I est les entrées et/ou les préconditions, O est les sorties et/ou postcondition, et R est le programme transformé, puis affirmer (en utilisant la logique temporelle?) Que

P:I -> O 

tient avant transformation

T(P) -> R 

définit la transformation et

R:I -> O 

tient après transformation

est rouillé mes maths symbolique, mais qui est une direction générale

cela ferait un bon mémoire de maîtrise, BTW

+0

Non. Une étape de refactoring peut changer la sémantique du programme. Envisager de supprimer un argument d'un appel de fonction. –

+0

@ [Ira Baxter]: oui - je me référais aux entrées et sorties du programme P, pas une fonction individuelle au sein de P. Bien sûr, vous pouviez laisser une entrée au programme si elle n'était pas utilisée, mais si elle n'était pas 't utilisé alors la sémantique pratique (par opposition à formelle) du programme reste de toute façon inchangée ;-) –

2

Il pourrait être intéressant de noter que la plupart des Refactorings viennent par paires:

  • Ajouter un paramètre - Supprimer le Paramètre
  • Extrait Classe/Méthode - Inline classe/Méthode
  • Pull Up Champ/Méthode - Tirer vers le bas Champ/Méthode
  • changement Association à bidirectionnel unidirectionnel - Change Association unidirectionnelles bidirectionnelle
  • ...

L'application des deux refactorings de la paire est une transformation nulle.

Pour une paire de refactoring R, R ':

R' (R (code)) = Code