Ho un sacco di classi che assomigliano a questo:
public class MyGame()
{
private Graphics graphics;
private Player player;
public MyGame()
{
graphics = new Graphics();
//...
}
protected void Initialize()
{
player = new Player();
//...
}
protected void Update()
{
player.DoStuff();
//...
}
Ho letto degli schemi di progettazione e ho capito che questo non è un ottimo progetto perché non è strettamente accoppiato. Invece di codificare per interfacce, sto codificando per implementazioni (Grafica, Player, ecc.).
Per correggere questo problema percepito, comincio cambiando quelle dipendenze alle interfacce:
public class MyGame()
{
private IGraphics graphics;
private IPlayer player;
public MyGame()
{
graphics = new Graphics();
//...
}
protected void Initialize()
{
player = new Player();
//...
}
Non sono sicuro di quanto sia veramente utile, ma è bello che il campo grafico (per esempio) non sia legato alla classe Graphics - Posso usare la classe AwesomeGraphics o la classe SparklyGraphics invece che quelle classi implementare IGraphics.
Ma ho ancora delle forti dipendenze da Graphics e Player, quindi qual è stato il punto di tutto ciò che riguarda il refactoring? (Il mio codice attuale è molto più complicato.) Ho anche capito che l'iniezione di dipendenza è una buona idea, quindi è quello che cerco di fare dopo:
public class MyGame()
{
private IGraphics graphics;
private IPlayer player;
public MyGame( IGraphics graphics, IPlayer player )
{
this.graphics = graphics;
this.player = player;
//...
}
Questo sembra davvero carino perché non ho più alcuna dipendenza da MyGame. Tuttavia, le dipendenze sono ancora nel mio codice: sono state appena spostate nella classe che istanzia MyGame:
static class Program
{
static void Main( string[] args )
{
using ( var game = new Game( new Graphics(), new Player() )
{
game.Run();
}
}
}
Ora sono tornato dove ho iniziato! Questa classe non è affatto accoppiato! Quindi, di nuovo, qual è stato il punto di tutto quel refactoring? Sono abbastanza sicuro di poter usare un contenitore IoC per occuparmi di queste dipendenze in qualche modo, ma probabilmente aggiungerebbe un sacco di complicazioni a un progetto già complicato. Inoltre, non sposterebbe quelle dipendenze ancora una volta in un'altra classe?
Dovrei rimanere fedele a ciò che avevo in primo luogo, o c'è qualche beneficio tangibile che non vedo ancora?