"Esterno" in questo contesto significa "osservabile per gli utenti". Gli utenti possono essere umani in caso di un'applicazione o altri programmi in caso di API pubblica.
Quindi, se sposti il metodo M dalla classe A alla classe B, ed entrambe le classi sono profonde all'interno di un'applicazione, e nessun utente può osservare alcun cambiamento nel comportamento dell'app a causa del cambiamento, allora puoi correttamente chiamarlo refactoring .
Se, OTOH, qualche altro sottosistema / componente di livello superiore cambia il suo comportamento o si interrompe a causa della modifica, questo è effettivamente (solitamente) osservabile per gli utenti (o almeno per gli amministratori di sistema che controllano i registri). Oppure se le tue classi facevano parte di un'API pubblica, potrebbe esserci un codice di terze parti che dipende dal fatto che M fa parte della classe A, non B. Quindi nessuno di questi casi è refactoring in senso stretto.
there is a tendency to call any code rework as refactoring which is, I guess, incorrect.
In effetti, è una triste, ma prevedibile conseguenza, che il refactoring diventerà di moda. Gli sviluppatori hanno eseguito la rilavorazione del codice in modo ad hoc per anni, ed è certamente più facile imparare una nuova parola d'ordine piuttosto che analizzare e modificare le abitudini radicate.
So what is the right word for reworks which change external behaviour?
Lo chiamerei riprogettazione .
Aggiornamento
A lot of interesting answers about interface, but wouldn't move method refactoring change the interface?
Di cosa? Le classi specifiche, sì. Ma queste classi sono direttamente visibili al mondo esterno in qualche modo? In caso contrario - poiché sono all'interno del tuo programma e non fanno parte dell'interfaccia esterna (API / GUI) del programma - nessuna modifica apportata è osservabile da parti esterne (a meno che il cambiamento non rompa qualcosa, di ovviamente).
Sento che c'è una domanda più profonda al di là di questa: esiste una classe specifica come entità indipendente da sola? Nella maggior parte dei casi, la risposta è no : la la classe esiste solo come parte di un componente più grande, un ecosistema di classi e oggetti, senza il quale non può essere istanziato e / o inutilizzabile. Questo ecosistema non include solo le sue dipendenze (dirette / indirette), ma anche altre classi / oggetti che dipendono da esso. Questo perché senza queste classi di livello superiore, la responsabilità associata alla nostra classe può essere priva di significato / inutile per gli utenti del sistema.
es. nel nostro progetto che riguarda gli affitti di auto, esiste una classe Charge
. Questa classe non ha utilità per gli utenti del sistema da sola, poiché gli agenti delle stazioni di noleggio e i clienti non possono fare molto con un addebito individuale: trattano i contratti di affitto nel loro complesso (che includono un sacco di diversi tipi di addebiti) . Gli utenti sono per lo più interessati alla somma totale di queste spese, che devono pagare alla fine; l'agente è interessato alle diverse opzioni contrattuali, alla durata del noleggio, al gruppo di veicoli, al pacchetto assicurativo, agli articoli ecc. ecc. selezionati, che (tramite sofisticate regole aziendali) determinano quali sono le spese e come viene calcolato il pagamento finale fuori da questi. E i rappresentanti dei paesi / analisti aziendali si preoccupano delle regole commerciali specifiche, della loro sinergia ed effetti (sul reddito dell'azienda, ecc.). Una singola carica di per sé non ha significato senza l'immagine più grande.
Recentemente ho rifattorizzato questa classe, rinominando la maggior parte dei suoi campi e metodi (per seguire la convenzione di denominazione Java standard, che era completamente trascurata dai nostri predecessori). Inoltre, pianifico ulteriori rifattori per sostituire i campi String
e char
con i tipi più appropriati enum
e boolean
. Tutto questo cambierà sicuramente l'interfaccia della classe, ma (se faccio il mio lavoro correttamente) nessuno di questi sarà visibile agli utenti della nostra app. A nessuno di loro importa quanto siano rappresentate le singole accuse, anche se sicuramente conoscono il concetto di carica . Avrei potuto selezionare ad esempio un centinaio di altre classi che non rappresentano alcun concetto di dominio, quindi essere anche concettualmente invisibili agli utenti finali, ma ho pensato che fosse più interessante scegliere un esempio in cui vi è almeno una certa visibilità a livello di concetto. Questo dimostra che le interfacce di classe sono solo rappresentazioni di concetti di dominio (nella migliore delle ipotesi), non la cosa reale *. La rappresentazione può essere modificata senza influenzare il concetto. E gli utenti hanno solo e comprendono il concetto; è nostro compito fare la mappatura tra concetto e rappresentazione.
* E si può facilmente aggiungere che il modello di dominio, che la nostra classe rappresenta, è di per sé solo una rappresentazione approssimativa di qualche "cosa reale" ...