Mi sembra che il metodo statico incoraggi un comportamento del genere. In questo caso abbiamo una classe globale con una funzione statica. Stiamo nascondendo il fatto che Foo
dipende da StaticWorker.DoWork()
.
Metodo statico
public class Foo
{
public void Bar()
{
StaticWorker.DoWork();
}
}
D'altra parte, i metodi a livello di istanza incoraggiano passare l'oggetto dipendente. Che è meglio che raggiungere un globale.
Metodo di istanza
public class Foo
{
Worker Worker;
public Foo(Worker worker)
{
this.Worker = worker;
}
public void Bar()
{
this.Worker.DoWork();
}
}
Ovviamente potresti passare una funzione, ma mi piace ancora l'astrazione che ottengo con gli oggetti.
Un altro enorme vantaggio dei metodi a livello di istanza è che la classe può implementare un'interfaccia che non è possibile fare per un metodo statico.
Questo è simile all'argomento Singleton. Gli stessi Singleton non causano danni se usati correttamente, ma rendono più facile per le persone chiamare il singleton su tutto il loro codice senza passarlo, creando nuovamente dipendenze invisibili e stato globale.
Ci sono delle eccezioni alla regola. A volte hai un metodo piccolo e leggero. Non cambierà mai, e non è una dipendenza per nient'altro, potrei renderlo statico. Devi usare il tuo miglior giudizio caso per caso, ma direi casi di favore, soprattutto se hai dei dubbi.
Mi sembra che ci siano molti vantaggi nell'usare i metodi di istanza e tutto ciò che devo fare è creare un'istanza di un oggetto. Un piccolo prezzo da pagare per i premi.