-2

我有一个类需要访问在另一个类中声明的全局对象。可能有一些关键字,例如 extern 可以让我这样做。我应该这样做还是如果我创建一个静态的“GlobalObjects”类会更好,我将允许我的所有类访问并且只访问对象:GlobalObjects.Object1.foo();

代码片段:

namespace Pong {
    public class Pong : Game {
            public Ball ball;
            public Paddle paddleOne;
            public Paddle paddleTwo;

            public Pong()
                : base() {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }
            // extra code
    }
}
4

2 回答 2

1

全局状态通常是一种不好的做法。然而,对于有很多很多对象可以与很多很多其他对象交互的应用程序,有时有某种机制让这些对象可以轻松找到彼此是有意义的。游戏设计通常属于这一类,其中游戏中的对象(玩家角色、NPC、坏人、物品等)都需要能够频繁地相互交互。

为了解决这个问题,有一种叫做“注册表”的设计模式,它在简单的游戏中经常被使用。该模式很简单:您创建一个Registry本质上是一个静态列表(或一堆静态列表)的类,其中包含需要相互交互的所有元素。

注册表模式以可维护性和可重构性为代价使您易于使用和快速开发,因此请谨慎使用它。如果您只是开始将所有可能的对象塞入其中,那么您很快就会得到一个无法管理的代码库。这种模式是为不太可能非常复杂的简单游戏量身定制的,而 Pong 听起来很合适。

于 2013-06-20T02:55:14.540 回答
0

扩展一下之前对该问题的评论/答案。我同意全局状态通常表明设计不佳。状态通常保存在数据存储中,因此可以根据需要进行访问。Oop 设计意味着对象遵循一组原则,例如单一责任原则。此外,一种行为存在于一个且仅一个类中。

在您的情况下,在不了解您要完成的工作的情况下:当您说您在另一个类中声明了全局对象时,您可以做的是使用 Gang of Four Singleton Pattern。也就是说,全局对象负责维护其实例,并且可以将此实例传回给需要访问它的任何人。通过这种方式,您将不需要另一个类(您的“全局对象”类),这会更好,因为类之间的依赖关系越少越好。类之间较少的依赖关系意味着设计不那么脆弱,也就是说,当您需要进行更改时,更改引入错误的可能性较小。

于 2013-06-20T03:25:31.270 回答