Best practice per rinominare, refactoring e rompere le modifiche con le squadre


10

Quali sono alcune best practice per il refactoring e la ridenominazione negli ambienti del team? Ne ho parlato con alcuni scenari in mente:

  1. Se una libreria a cui viene comunemente fatto riferimento viene refactored per introdurre una modifica sostanziale a qualsiasi libreria o progetto che fa riferimento a essa. Ad esempio, cambiare arbitrariamente il nome di un metodo.

  2. Se i progetti vengono rinominati e le soluzioni devono essere ricostruite con riferimenti aggiornati ad esse.

  3. Se la struttura del progetto viene modificata per essere "più organizzata" introducendo cartelle e spostando progetti o soluzioni esistenti in nuove posizioni.

Alcuni pensieri / domande aggiuntivi:

  1. Cambiamenti come questo o il dolore che ne risulta sono indicativi di una struttura andata male?

  2. Chi dovrebbe assumersi la responsabilità di correggere gli errori relativi a un cambiamento radicale? Se uno sviluppatore apporta una modifica sostanziale, dovrebbe essere responsabile di accedere ai progetti interessati e aggiornarli o dovrebbe avvisare gli altri sviluppatori e chiedere loro di cambiare le cose?

  3. È qualcosa che può essere fatto su base programmata o è qualcosa che dovrebbe essere fatto il più frequentemente possibile? Se un refactoring viene rimandato troppo a lungo, è sempre più difficile riconciliarsi, ma allo stesso tempo in un giorno impiegando incrementi di 1 ora per correggere un build a causa dei cambiamenti che avvengono altrove.

  4. È una questione di un processo di comunicazione formale o può essere organico?


1
Carica tutti $ 1 per ogni volta che interrompono la build ... Saresti sorpreso di quanto possa frenare gli errori negligenti.
Berin Loritsch,

+1 perché il tuo commento ha ispirato 3 risposte eccellenti e diverse.
Carl Manaster,

Risposte:


13

Ciascuno degli scenari che hai elencato rientra nella categoria di "API / codice pubblicato". Questo è difficile da riformattare, quindi non si dovrebbe cambiare nulla alla leggera. Piuttosto, dovrebbe negoziare preventivamente le modifiche pianificate con tutte le parti coinvolte. È almeno una questione politica quanto tecnica.

Quindi il consiglio numero uno al riguardo di Martin Fowler è di non pubblicare prematuramente le interfacce (nomi e strutture del progetto) .

Tuttavia, se è già stato fatto e deve essere riparato, probabilmente è meglio provare a fare le modifiche necessarie nel minor numero di passaggi possibile, per ridurre al minimo l'interruzione di altre parti. Che si discosta abbastanza dal concetto originale di refactoring, ma per una buona ragione.

Inoltre, se possibile, prendere in considerazione l' aggiunta del nuovo metodo (deprecando quello esistente) invece di rinominare quello esistente. Ciò garantisce che il codice client non si interrompa e fornisce loro un periodo di transizione per aggiornare il proprio codice per conformarsi all'API più recente. Lo svantaggio è che complica la tua API. Sebbene lo stato sia solo temporaneo, tuttavia potrebbe essere necessario molto tempo prima che sia possibile rimuovere in sicurezza metodi API obsoleti (nel caso della libreria di classi Java, anni).


Non puoi usare il consiglio di Martin Fowler (altrimenti buono) quando stai refactoring il codice scritto da altri. Inoltre, suppongo che lo sviluppatore che ha deprecato i metodi dovrebbe ricordare ai suoi colleghi di utilizzare i nuovi metodi di volta in volta senza essere troppo fastidioso per accelerare la transizione. Ho l'impressione che i metodi obsoleti nella libreria di classi Java esistano sempre per compatibilità con le versioni precedenti, ma potrei sbagliarmi.
blizpasta,

@blizpasta, dipende da quanti client ha l'API in questione. Se ne hai una mezza dozzina, tutti all'interno dello stesso dipartimento, potrebbero essere necessarie alcune discussioni e discussioni e alcuni mesi per completare la transizione in circostanze normali. Se hai milioni di utenti e miliardi di LOC di codice client in tutto il mondo, allora sì, molto probabilmente non rimuoverai mai quei metodi obsoleti.
Péter Török,

5

È quasi sempre possibile evitare questi problemi eseguendo il refactoring in due passaggi. Nel primo passaggio, introdurre il nuovo codice e deprecare il vecchio codice. Quando tutti i team sono passati al nuovo codice, elimina il vecchio codice. Uso anche questa tecnica per refactoring incrementale di un singolo modulo. In questo modo posso limitare la quantità di codice che deve essere modificata tra le esecuzioni di test.


2
Quando ho fatto questo, sono stato spesso in grado di cambiare il vecchio codice per chiamare il nuovo codice. Ciò gli consente di diventare un metodo stub e fornisce il codice (si spera) migliorato per i client del vecchio metodo.
BillThor,

4

Si noti che questo è uno dei motivi principali per disporre di un server di build, che esegue test.

Se succede qualcosa che interromperà un determinato programma, ti viene detto il più rapidamente possibile e puoi dare la caccia al colpevole e risolvere i problemi mentre i dettagli sono ancora aggiornati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.