Supponiamo che tu abbia una libreria statica come questa:
class SessionHelper
{
static public void Foo()
{
//Implementation
}
static public void Bar()
{
//Implementation
}
}
E un programma che lo usa, che preferiresti non scimmi troppo:
class MassiveSpaghettiCode
{
void DoSomethingNobodyUnderstands()
{
SessionHelper.Foo();
SessionHelper.Bar();
}
}
Vorrei estrarre i metodi statici in un'interfaccia e copiare il codice di implementazione dalla classe statica, esponendo solo ogni metodo come membro dell'interfaccia.
interface ISessionHelper
{
void Foo();
void Bar();
}
class SessionHelper : ISessionHelper
{
public void Foo()
{
//Implementation
}
public void Bar()
{
//Implementation
}
}
Quindi esporre un'istanza dell'implementazione tramite una proprietà membro con lo stesso nome della classe statica originale. Ciò consente al codice spaghetti precedente di continuare a funzionare senza alcuna modifica. Per i punti bonus, possiamo iniettare l'istanza se vogliamo.
class MassiveSpaghettiCode
{
protected readonly ISessionHelper _sessionHelper;
protected ISessionHelper SessionHelper
{
get
{
return _sessionHelper;
}
}
public MassiveSpaghettiCode() : this( new SessionHelper() ) //Default constructor requires no injection
{
}
public MassiveSpaghettiCode(ISessionHelper sessionHelper)
{
_sessionHelper = sessionHelper; //Injected, or injectable at least
}
void DoSomethingNobodyUnderstands()
{
SessionHelper.Foo(); //Notice this code hasn't changed at all
SessionHelper.Bar();
}
}
Una volta che il codice esistente è stato estratto in un'interfaccia / implementazione, scrivi una serie di test di integrazione e rendilo bello e stabile. Vuoi assicurarti di capire cosa significhi soddisfare il contratto implicito da tale interfaccia, non solo sintatticamente ma semanticamente.
Una volta che hai compreso a fondo l'interfaccia implementata dal codice legacy, crea una nuova classe, implementando la stessa interfaccia, ma con un codice nuovo utilizzando la tua nuova tecnologia di back-end (Redis, o qualsiasi altra cosa). Esegui questa lezione attraverso esattamente gli stessi test di unità. Assicurati di poter spiegare qualsiasi differenza nei risultati del test; idealmente non dovrebbe essercene.
Una volta che tutti i test passano in modo identico, sei pronto per disattivarlo, il che è facile come cambiare la dipendenza.
P.S. Credo che questo sia più o meno l'approccio adottato da Microsoft durante la migrazione di tutti gli utenti da ASP classico a ASP.NET, ad es. la sintassi Session e Response sembrava la stessa, ma funzionava in modo piuttosto diverso.