Kelas statis tidak masalah asalkan digunakan di tempat yang tepat.
Yaitu: Metode yang merupakan metode 'daun' (mereka tidak mengubah status, mereka hanya mengubah input). Contoh bagusnya adalah seperti Path.Combine. Hal-hal semacam ini berguna dan membuat sintaks yang lebih pendek.
The masalah yang saya miliki dengan statika banyak:
Pertama, jika Anda memiliki kelas statis, dependensi disembunyikan. Pertimbangkan hal berikut:
public static class ResourceLoader
{
public static void Init(string _rootPath) { ... etc. }
public static void GetResource(string _resourceName) { ... etc. }
public static void Quit() { ... etc. }
}
public static class TextureManager
{
private static Dictionary<string, Texture> m_textures;
public static Init(IEnumerable<GraphicsFormat> _formats)
{
m_textures = new Dictionary<string, Texture>();
foreach(var graphicsFormat in _formats)
{
// do something to create loading classes for all
// supported formats or some other contrived example!
}
}
public static Texture GetTexture(string _path)
{
if(m_textures.ContainsKey(_path))
return m_textures[_path];
// How do we know that ResourceLoader is valid at this point?
var texture = ResourceLoader.LoadResource(_path);
m_textures.Add(_path, texture);
return texture;
}
public static Quit() { ... cleanup code }
}
Melihat TextureManager, Anda tidak dapat mengetahui langkah-langkah inisialisasi apa yang harus dilakukan dengan melihat konstruktor. Anda harus mempelajari kelas untuk menemukan dependensinya dan menginisialisasi hal-hal dalam urutan yang benar. Dalam kasus ini, ResourceLoader harus diinisialisasi sebelum dijalankan. Sekarang tingkatkan mimpi buruk ketergantungan ini dan Anda mungkin bisa menebak apa yang akan terjadi. Bayangkan mencoba mempertahankan kode di mana tidak ada urutan inisialisasi yang eksplisit. Bandingkan ini dengan injeksi ketergantungan dengan instance - dalam hal ini kode bahkan tidak dapat dikompilasi jika dependensi tidak terpenuhi!
Lebih jauh lagi, jika Anda menggunakan statika yang mengubah status, ini seperti rumah kartu. Anda tidak pernah tahu siapa yang memiliki akses ke apa, dan desainnya cenderung menyerupai monster spaghetti.
Akhirnya, dan sama pentingnya, menggunakan statika mengikat program ke implementasi tertentu. Kode statis adalah antitesis dari perancangan untuk kemudahan pengujian. Menguji kode yang penuh dengan statika adalah mimpi buruk. Panggilan statis tidak pernah dapat ditukar dengan pengujian ganda (kecuali Anda menggunakan framework pengujian yang dirancang khusus untuk meniru jenis statis), sehingga sistem statis menyebabkan semua yang menggunakannya menjadi pengujian integrasi instan.
Singkatnya, statika baik-baik saja untuk beberapa hal dan untuk alat kecil atau kode sekali pakai, saya tidak akan melarang penggunaannya. Namun, di luar itu, mereka adalah mimpi buruk berdarah untuk perawatan, desain yang baik, dan kemudahan pengujian.
Berikut artikel bagus tentang masalah tersebut: http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/