5

我正在编写一个 XNA 引擎,并将所有模型存储在List. 为了能够在整个引擎中使用它,我将它设为 a public static List<Model>,以便我可以从我开发的任何新类中访问它。这当然也让获取模型列表变得非常容易,但这是正确的用法吗?或者我最好在方法声明中实际传递一个变量?

4

5 回答 5

5

在 OOP 中,通常建议避免使用静态方法和属性,除非您有充分的理由这样做。其中一个原因是,将来您可能出于某种原因希望拥有此列表的两个或更多实例,然后您将被静态调用困住。

静态方法和属性过于死板。正如史蒂夫所说:

静态方法与花岗岩一样灵活。每次你使用一个,你就是在具体地铸造你的程序的一部分。只要确保你的脚没有卡在那里,因为你正在看着它变硬。有一天你会惊奇地发现,天哪,你真的需要那个该死的 PrintSpooler 类的另一个实现,它应该是一个接口、一个工厂和一组实现类。哦!

于 2011-04-04T07:56:17.690 回答
5

对于游戏开发,我提倡“做最简单的可能可行的事情”。这包括使用全局变量(public static在 C# 中),如果这是一个简单的解决方案的话。你以后总是可以把它变成更正式的东西。Visual Studio 中的“查找所有引用”工具使这变得非常容易。

话虽如此,在极少数情况下,全局变量实际上是做某事的“正确”方式。所以如果你要使用它,你应该知道理解正确的解决方案。所以你可以在“懒惰”和“写好代码”之间做出最好的权衡。

如果你打算做一些全球性的事情,你需要完全理解你为什么要这样做。

在这种特殊情况下,听起来您正在尝试获取内容。您应该知道,如果您多次请求它,ContentManager它将自动返回相同的内容对象。因此,与其将模型加载到全局列表中,不如考虑通过类的属性使Game类的内置ContentManager可用。public staticGame

或者,更好的是,有一种我更喜欢的方法,我认为它更好一点:我在另一个问题的答案中解释它。基本上,您private static在使用它们的类中进行内容引用并将其传递给ConentManager函数public static LoadContent。这将您对静态的使用划分为单个类,而不是使用从整个程序访问的全局(以后很难解脱)。它还可以在正确的时间正确处理加载内容。

于 2011-04-04T08:31:14.253 回答
1

我会尽可能避免使用 static ,随着时间的推移,你最终会得到spaghetti code

如果你在构造函数中传递它,你正在消除不必要的依赖,低耦合是好的。依赖项越少越好。

于 2011-04-04T08:16:54.300 回答
0

我建议实现一个封装模型列表的 Singleon 对象。
查看MSDN 单例实现

于 2011-04-04T07:54:27.193 回答
0

这是一个平衡和权衡的问题。

当然,OOP 纯粹主义者会说要不惜一切代价避免这样的全局变量,因为它通过为任何模块引入“开箱即用”的东西来破坏代码分隔,从而使其难以维护、更改、调试等。

然而,我个人的经验是,只有当你是一个非常大的企业解决方案团队的一员,维护一个非常大的企业级应用程序时,才应该避免这种情况。

对于其他情况,将全局可访问的数据封装到“全局”对象(或静态对象,同样的东西)中可以在很大程度上简化 OOP 编码。

您可以通过编写一个返回模型列表的全局 GetModels() 函数来获得中间立场。或者使用 DI 自动注入模型列表。

于 2011-04-04T07:56:53.650 回答