TOP
Cos'è il refactoring?
Descrizione
Refactoring (Refactoring) – modifiche apportate alla struttura interna del software (software) per renderlo più facile da comprendere e più veloce da modificare senza modificare il comportamento esterno. Inoltre, si tratta di una ristrutturazione del software attraverso l'applicazione di una sequenza di refactoring senza modificare il comportamento esterno del software.
Vantaggi del refactoring:
- Il refactoring migliora la progettazione del software. Nel tempo, vengono apportate molte modifiche aggiuntive al codice e il software perde la sua struttura nel tempo. La perdita di struttura ha un effetto cumulativo. Più è difficile vedere il disegno nel codice, più difficile sarà mantenerlo e più velocemente andrà in pezzi. Inoltre, tali modifiche causano ridondanza e duplicazione del codice, rendendo il sistema più difficile da comprendere e modificare.
- Il refactoring rende il codice software più comprensibile.
Quando è necessario eseguire il refactoring:
- Quando viene aggiunta una nuova funzionalità;
- Quando un errore viene corretto (risolto);
- Durante la revisione del codice.
Cattivi odori nel codice (Smells Catalog) :
- Duplicazione del codice
- Metodo lungo
- Grande classe
- Un lungo elenco di parametri
- Modifiche divergenti
- Tiro a segno
- Caratteristiche invidiose
- Blocchi di dati
- Ossessione per i tipi elementari
- Switch operatori
- Gerarchie parallele di imitazione
- Classe pigra
- Comunità speculativa (teorica).
- Campo temporaneo
- Thread di messaggi
- Agente
- Vicinanza inappropriata
- Classi alternative con interfacce diverse
- Classe di libreria incompleta
- Classi di dati
- Commenti
Possibili opzioni di refactoring
-
Moving Features Between Objects (Trasferimento del codice completato tra oggetti):
- Move Method (Evidenziazione del metodo) – isolare un metodo separato se il metodo è troppo lungo o contiene il codice che richiede commenti.
- Move Field (Campo in movimento) – eseguito quando il campo è utilizzato da un'altra classe più spesso rispetto a dove è definito.
-
Organizing Data (Disposizione delle date):
- Encapsulate Field (Incapsulamento del campo) - Uno dei principi fondamentali dell'OOP è l'incapsulamento o l'occultamento dei dati. Rendendo pubblici i dati, gli oggetti possono leggerne e modificarne i valori all'insaputa del proprietario dei dati. Pertanto chiudiamo questo campo e forniamo le modalità di accesso.
- Encapsulate Collection (Incapsulamento della raccolta) - spesso l'aula contiene una raccolta di esemplari. Questa raccolta può essere una matrice, una lista, un insieme o un vettore. Il metodo getter non dovrebbe restituire l'oggetto della collezione stessa, poiché consentirebbe al client di modificare il contenuto della collezione senza la classe che possiede. È quindi necessario rendere il valore restituito dal metodo sola lettura e creare metodi per aggiungere/rimuovere elementi.
-
Composing Methods (Estrazione e combinazione del codice):
- Extract Method (Evidenziazione del metodo) – se c’è una parte di codice che può essere raggruppata, inserirla in un metodo separato con un nome che non ne spieghi lo scopo. Pertanto, il nome del metodo sostituirà i commenti.
- Inline Method (Modalità di incorporazione) – a volte è utile spostare il corpo di un metodo nel codice che lo chiama. A volte i corpi dei metodi sono autoesplicativi quanto il nome stesso del metodo. Potrebbe anche verificarsi una situazione in cui esistono molti metodi diversi, la cui struttura non ha successo, e quindi è meglio inserirli tutti in un metodo generale e quindi separare i metodi in un altro modo.
- Inline Temp (Inserimento di una variabile temporanea) – sostituzione di una variabile temporanea a cui è assegnata un'espressione semplice una sola volta. A volte la variabile interferisce con altri refactoring.
- Replace Temp with Query (Sostituzione di una variabile temporanea con una chiamata al metodo) – si utilizza quando si utilizza una variabile temporanea per memorizzare il valore di un'espressione. In questo caso, sostituiamo l'espressione con un metodo e sostituiamo tutti i riferimenti nel codice a questa variabile con il nuovo metodo.
- Split Temporary Variable (Dividi una variabile temporanea) – se viene applicata un’unica variabile temporanea, viene utilizzata per assegnare più risultati a risultati diversi (a meno che non sia una variabile utilizzata in un ciclo interno al ciclo e non sia una variabile per accumulare il risultato). In questo caso, creiamo una variabile separata per ogni assegnazione.
-
Simplifying Conditional Expressions (Semplificando le espressioni con condizioni):
- Decompose Conditional (Composizione dell'operatore condizionale) – eseguito quando abbiamo una catena di controlli condizionali (if-then-else). Sostituiamo la condizione (if), parti di then e else con metodi separati. Contribuisce a comprendere meglio il motivo della ramificazione e i nomi dei metodi chiariscono lo scopo della parte corrispondente del codice.
- Consolidate Conditional Expression (Consolidamento dell'espressione condizionale) - viene eseguito se sono presenti più controlli che danno lo stesso risultato. È necessario combinare tutti i controlli in un'unica espressione o metodo condizionale.
- Consolidate Duplicate Conditional Fragments (Consolidamento di frammenti duplicativi condizionali) – lo stesso frammento è presente in tutti i rami dell’espressione condizionale. Devi spostare questo pezzo di codice all'esterno di questa espressione.
- Remove Control Flag (Rimuovere la bandiera di controllo) – esiste una variabile che funziona come flag di controllo per una serie di espressioni logiche. Usiamo invece BREAK o RETURN.
- Replace Conditional with Polymorphism (Sostituendo l'operatore condizionale con il polimorfismo) – viene eseguito quando è presente un operatore, il cui comportamento dipende dal tipo di oggetto. È necessario spostare ogni ramo dell'operatore condizionale in un metodo sovraccaricato della sottoclasse. Rendi astratto il codice sorgente.