ชั้นเรียนแบบคงที่นั้นใช้ได้ตราบเท่าที่ใช้ในสถานที่ที่เหมาะสม
วิธีการที่เป็นวิธีการ 'leaf' (ไม่ได้แก้ไขสถานะเป็นเพียงการแปลงอินพุตอย่างใดอย่างหนึ่ง) ตัวอย่างที่ดีคือสิ่งต่างๆเช่น Path.Combine สิ่งต่างๆเหล่านี้มีประโยชน์และเหมาะสำหรับไวยากรณ์ที่สั้นกว่า
ปัญหาที่ฉันมีกับสถิตเป็นจำนวนมาก:
ประการแรกถ้าคุณมีคลาสแบบคงที่การอ้างอิงจะถูกซ่อนไว้ พิจารณาสิ่งต่อไปนี้:
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 }
}
เมื่อดู TextureManager คุณไม่สามารถบอกได้ว่าขั้นตอนการเริ่มต้นต้องดำเนินการอย่างไรโดยดูที่ตัวสร้าง คุณต้องเจาะลึกในคลาสเพื่อค้นหาการอ้างอิงและเริ่มต้นสิ่งต่าง ๆ ตามลำดับที่ถูกต้อง ในกรณีนี้จำเป็นต้องเริ่มต้น ResourceLoader ก่อนที่จะรัน ตอนนี้ขยายฝันร้ายของการพึ่งพานี้และคุณอาจเดาได้ว่าจะเกิดอะไรขึ้น ลองนึกภาพว่าพยายามรักษารหัสโดยที่ไม่มีลำดับการเริ่มต้นอย่างชัดเจน ตรงกันข้ามกับการแทรกการพึ่งพากับอินสแตนซ์ - ในกรณีนี้โค้ดจะไม่คอมไพล์ด้วยซ้ำหากการอ้างอิงไม่สำเร็จ!
นอกจากนี้หากคุณใช้สถิตยศาสตร์ที่ปรับเปลี่ยนสถานะก็เหมือนกับบ้านของไพ่ คุณไม่มีทางรู้ว่าใครสามารถเข้าถึงอะไรได้บ้างและการออกแบบมักจะคล้ายกับสัตว์ประหลาดสปาเก็ตตี้
สุดท้ายและที่สำคัญเช่นเดียวกับการใช้ statics จะเชื่อมโยงโปรแกรมกับการนำไปใช้งานเฉพาะ Static code คือสิ่งที่ตรงกันข้ามกับการออกแบบเพื่อการทดสอบ การทดสอบโค้ดที่เต็มไปด้วยสถิตยศาสตร์เป็นฝันร้าย ไม่สามารถสลับการโทรแบบคงที่สำหรับการทดสอบสองครั้ง (เว้นแต่คุณจะใช้กรอบการทดสอบที่ออกแบบมาโดยเฉพาะเพื่อจำลองประเภทคงที่) ดังนั้นระบบแบบคงที่ทำให้ทุกอย่างที่ใช้เป็นการทดสอบการรวมแบบทันที
ในระยะสั้นสถิตยศาสตร์ใช้ได้ดีสำหรับบางสิ่งและสำหรับเครื่องมือขนาดเล็กหรือโค้ดที่ทิ้งฉันจะไม่กีดกันการใช้งาน อย่างไรก็ตามนอกเหนือจากนั้นพวกเขาเป็นฝันร้ายที่น่ากลัวสำหรับการบำรุงรักษาการออกแบบที่ดีและความง่ายในการทดสอบ
นี่คือบทความดีๆเกี่ยวกับปัญหา: http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/