Un modo comune di rifattorizzare il codice in questo modo è attraverso l'ereditarietà, utilizzando metodi astratti o virtuali per il comportamento che può variare.
Supponiamo che tu abbia un metodo per pagare i dipendenti e un altro per pagare il CEO:
void PayNormalEmployee()
{
// do stuff
// do more stuff
// give meager bonus
// do final stuff
}
void PayCeo()
{
// do stuff
// do more stuff
// give huge bonus
// do final stuff
}
Supponiamo che tu debba fare le cose nell'ordine sopra; non puoi semplicemente riordinare per impostare la parte bonus come ultimo passo.
Il modo di refactoring è attraverso l'ereditarietà. Metti il comportamento comune in una classe base e metti il comportamento distinto in sottoclassi distinte. La tua linea comune (o set di linee) dovrebbe chiamare un metodo separato. Ad esempio:
abstract class EmployeeBase
{
public void Pay()
{
// do stuff
// do more stuff
PayBonus();
// do final stuff
}
protected abstract void PayBonus();
}
class NormalEmployee : EmployeeBase
{
override void PayBonus()
{
// pay meager bonus
}
}
class Ceo : EmployeeBase
{
override void PayBonus()
{
// pay huge bonus
}
}
Se il tuo dipendente è un dipendente normale o un amministratore delegato, lui / lei ha accesso al metodo Pay, ma verrà utilizzata l'implementazione nella classe derivata.
Se esiste un'implementazione "predefinita", puoi semplificare la procedura:
class Employee
{
public void Pay()
{
// do stuff
// do more stuff
PayBonus();
// do final stuff
}
protected virtual void PayBonus()
{
// pay meager bonus
}
}
class Ceo : Employee
{
override void PayBonus()
{
// pay huge bonus
}
}
Ancora una volta, l'amministratore delegato ha accesso al metodo Pay, ma utilizzerà la sua speciale implementazione PayBonus; ma tutto continuerà comunque nell'ordine corretto.