Ho notato che quasi ogni volta che vedo i programmatori che usano classi statiche in linguaggi orientati agli oggetti come C #, lo fanno male. I problemi principali sono ovviamente lo stato globale e la difficoltà di scambiare implementazioni in fase di esecuzione o con mock / stub durante i test.
Per curiosità, ho esaminato alcuni dei miei progetti selezionando quelli che sono ben testati e quando ho fatto uno sforzo per pensare effettivamente all'architettura e al design. I due usi delle classi statiche che ho trovato sono:
-
La classe di utilità-qualcosa Preferirei evitare se stavo scrivendo questo codice oggi,
-
La cache dell'applicazione: l'uso della classe statica è chiaramente sbagliato. Cosa succede se voglio sostituirlo con
MemoryCache
o Redis?
Guardando .NET Framework, non vedo alcun esempio di un uso valido delle classi statiche. Ad esempio:
-
La classe statica
-
File
rende davvero doloroso passare a alternative. Ad esempio, cosa succede se è necessario passare a Storage isolato o memorizza i file direttamente nella memoria o ha bisogno di un provider che supporti le transazioni NTFS o almeno sia in grado di gestire i percorsi più lunghi di 259 caratteri ? Avere un'interfaccia comune e più implementazioni appare facile come usareFile
direttamente, con vantaggio di non dover riscrivere la maggior parte della base di codice quando i requisiti cambiano.
La classe statica -
Console
rende i test troppo complicati. Come dovrei garantire all'interno di una unit test che un metodo restituisca dati corretti da console? Dovrei modificare il metodo per inviare l'output ad un% co_de scrivibile che viene iniettato in fase di esecuzione? Sembra che una classe di console non statica sarebbe semplice come una statica, solo senza tutti gli svantaggi di una classe statica, ancora una volta. -
Stream
static non è un buon candidato; cosa succede se ho bisogno di passare ad aritmetica di precisione arbitraria? O per un'implementazione più recente e più veloce? O a uno stub che dirà, durante un test unitario, che un determinato metodo di una classeMath
è stato effettivamente chiamato durante un test?
Su Programmer.SE, ho letto:
-
Non utilizzare "Statico" in C #? Alcune risposte sono piuttosto contro le classi statiche. Altri affermano che "I metodi statici vanno bene e hanno un posto legittimo nella programmazione.", Ma non li infornano con argomenti.
-
Quando utilizzare un Singleton e quando utilizzare una classe statica . Le classi di utilità sono menzionate, dato che ho detto sopra che le classi di utilità sono problematiche.
-
Perché e quando dovrei rendere una classe "statica"? Qual è lo scopo della parola chiave 'statica' sulle classi? L'unico utilizzo valido menzionato è un contenitore per i metodi di estensione. Grande.
A parte i metodi di estensione, quali sono gli usi validi delle classi statiche, vale a dire i casi in cui Iniezione delle dipendenze o singleton sono impossibili o risulteranno in un design di qualità inferiore e in una maggiore estensibilità e manutenzione?