Refactoring
Con refactoring (o code refactoring), nell'ingegneria del software, si indica una "tecnica strutturata per modificare la struttura interna di porzioni di codice senza modificarne il comportamento esterno",[1] applicata per migliorare alcune caratteristiche non funzionali del software quali la leggibilità, la manutenibilità, la riusabilità, l'estensibilità del codice nonché la riduzione della sua complessità, eventualmente attraverso l'introduzione a posteriori di design pattern.[2] Si tratta di un elemento importante delle principali metodologie emergenti di sviluppo del software (soprattutto object-oriented), per esempio delle metodologie agili, dell'extreme programming, e del test driven development.
Descrizione
[modifica | modifica wikitesto]Benché il concetto generale di refactoring possa essere applicato in qualsiasi contesto di sviluppo software, nelle metodologie agili e nell'extreme programming il termine è usato prevalentemente nel contesto della programmazione orientata agli oggetti. In questa accezione stretta (proposta originariamente da Martin Fowler, che è tuttora uno degli autori più influenti sull'argomento),[3] il refactoring è in genere motivato dalla rilevazione di un code smell.[4] Per esempio, un metodo potrebbe apparire eccessivamente lungo e complesso, o contenere molto codice duplicato anche in un altro metodo.
L'azione di refactoring mira a eliminare il problema (per esempio portando a fattor comune il codice duplicato) attraverso una serie di "micro-passi" il più possibile semplici.[4] Il requisito di semplicità delle singole modifiche ha due giustificazioni: ridurre il rischio di introdurre errori con la modifica, e rendere ipotizzabile l'esecuzione automatica della modifica stessa da parte di strumenti integrati negli IDE. Gran parte della letteratura sul refactoring descrive tipi di micro-modifiche di uso comune che, combinate in sequenza, possono portare a ristrutturazioni anche radicali del software, e molte delle azioni di refactoring proposte in letteratura sono implementate da IDE moderni come Eclipse.
Il refactoring è un elemento integrante di molti processi di sviluppo fortemente basati su test automatici; per esempio, lo sviluppo basato su test (TDD) prevede una fase (obbligatoria ed esplicita) di refactoring al termine di ogni ciclo di modifica. Fra i due concetti esiste infatti un legame molto stretto: rieseguire eventuali test automatici al termine di ogni micromodifica fornisce infatti un più alto grado di confidenza che non siano stati introdotti errori; questo consente di prendere in considerazione anche modifiche particolarmente pericolose (come lo spostamento di codice fra classi o la modifica delle relazioni di ereditarietà).
Software utilizzati
[modifica | modifica wikitesto]Molti IDE forniscono supporto al refactoring del codice. Funzioni di refactoring sono incluse per esempio nei seguenti IDE:
- IntelliJ IDEA (per Java)
- Eclipse (per Java)
- NetBeans (per Java)
- Embarcadero C++ e C (ex Borland C/C++ Builder)
- Embarcadero Delphi
- Visual Studio (per piattaforma .NET nelle versioni dal 2003 in poi)
- PyCharm (per Python)
- WingIDE 4.x e 5.x di WingWare
- KomodoIDE
- PhpStorm per PHP
Note
[modifica | modifica wikitesto]- ^ Martin Fowler in refactoring.com
- ^ Joshua Kerievsky, Refactoring to Patterns
- ^ Fowler è tra l'altro l'autore del primo libro sull'argomento: Refactoring: Improving the Design of Existing Code, e mantiene il sito refactoring.com, che raccoglie molte risorse sul refactoring.
- ^ a b V. M. Fowler, Refactoring
Bibliografia
[modifica | modifica wikitesto]- Martin Fowler, Kent Beck, John Brant e William Opdyke, Refactoring: Improving the Design of Existing Code
- Joshua Kerievsky, Refactoring to Patterns
- William C. Wake, Refactoring Workbook
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, refactoring, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- refactoring.com, raccolta di risorse sul refactoring mantenuta da Martin Fowler
Controllo di autorità | LCCN (EN) sh99002049 · GND (DE) 4784343-3 · J9U (EN, HE) 987007566125005171 · NDL (EN, JA) 01191220 |
---|