我正在编写一个XNA引擎,我将所有模型存储在List
中。为了能够在整个引擎中使用它,我已经将它设为public static List<Model>
,因此我可以从我开发的任何新类中访问它。它当然使获得模型列表真的很容易获得,但这是正确的用法吗?或者我会更好地在方法声明中传递变量吗?
答案 0 :(得分:5)
在OOP中,通常建议避免使用静态方法和属性,除非您有充分的理由这样做。其中一个原因是,将来您可能出于某种原因希望有两个或更多此列表的实例,然后您将陷入静态调用。
静态方法和属性太僵硬了。正如Stevey所述:
静态方法同样灵活 花岗岩。每次使用一个, 你正在投入你的计划的一部分 具体。只要确保你没有 把你的脚塞进那里 你看着它变硬了。总有一天你 天哪,你会惊讶的 真的需要另一个实现 当然PrintSpooler类,和 它应该是一个界面,一个 工厂,和一套实施 类。 D'哦!
答案 1 :(得分:5)
对于游戏开发,我提倡“做最简单的事可能工作”。这包括使用全局变量(C#中的public static
),如果这是一个简单的解决方案。你可以随时把它变成更正式的东西。 Visual Studio中的“查找所有引用”工具使这非常简单。
如果说,很少有情况下全局变量实际上是做某事的“正确”方式。因此,如果您打算使用它,您应该了解并了解正确的解决方案。因此,您可以在“懒惰”和“编写好代码”之间做出最佳权衡。
如果您要制作全球性内容,则需要完全理解为什么这样做。
在这种特殊情况下,听起来你正试图尝试获取内容。您应该知道ContentManager
会自动返回相同的内容对象,如果您多次要求它。因此,不要将模型加载到全局列表中,而应考虑通过Game
类的ContentManager
属性使public static
类的内置Game
可用。
或者,更好的是,有一种我更喜欢的方法,我觉得有点好:I explain it in the answer to another question。基本上,您在使用它们的类中创建内容引用private static
,并将ConentManager
传递给public static LoadContent
函数。这将您对静态的使用划分为单个类,而不是使用从您的整个程序中访问的全局(这将很难在以后解脱)。它还可以在正确的时间正确处理加载内容。
答案 2 :(得分:1)
我会尽量避免使用静态,随着时间的推移,你最终只会使用spaghetti code。
如果在构造函数中传递它,则消除了不必要的依赖关系low coupling is good。依赖性越少越好。
答案 3 :(得分:0)
我建议实现一个封装模型列表的Singleon对象 看看MSDN singleton implementation。
答案 4 :(得分:0)
这是一个平衡和权衡的问题。
当然,OOP纯粹主义者会说不惜一切代价避免这样的全局变量,因为它通过引入任何模块“开箱即用”的东西来破坏代码区域化,从而使得难以维护,更改,调试等
但是,我个人的经验是,只有当您是一个非常大的企业解决方案团队的一员,维护一个非常大的企业级应用程序时,才应该避免这种情况。
对于其他情况,将全局可访问数据封装到“全局”对象(或静态对象,同样的东西)中可以在很大程度上简化OOP编码。
您可以通过编写返回模型列表的全局GetModels()函数来获得中间立场。或者使用DI自动注入模型列表。