更好的面向对象设计



我有一个类需要访问在另一个类中声明的全局对象。可能有一些关键字,如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
    }
}

全局状态一般来说是一个不好的做法。然而,对于有很多很多对象可以与很多很多其他对象进行交互的应用程序来说,有时为这些对象提供某种机制来轻松地找到彼此是有意义的。游戏设计通常属于这一类,即游戏中的对象(玩家角色,npc,坏人,道具等)都需要能够频繁地相互互动。

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

注册中心模式以牺牲可维护性和可重构性为代价,为您带来了易用性和快速开发,因此请注意适当地使用它。如果你开始把所有可能的对象都塞进去,那么你很快就会得到一个难以管理的代码库。这种模式是为不太可能非常复杂的简单游戏量身定制的,《Pong》听起来是个不错的选择。

对这个问题的前面的评论/回答进行一点扩展。我同意全局状态通常意味着糟糕的设计。状态通常保存在数据存储中,因此可以根据需要访问。面向对象设计意味着对象遵循一组原则,例如单一职责原则。而且,一个行为存在于且只能存在于一个类中。

在你的情况下,不知道你想要完成什么:当你说你在另一个类中声明了全局对象时,你可以做的是使用四人组单例模式。也就是说,全局对象负责维护其实例,并可以将该实例传递给需要访问它的任何人。这样,你就不需要另一个类(你的"全局对象"类),这将是更好的,因为类之间的依赖越少越好。类之间的依赖更少意味着设计更不脆弱,也就是说,当您需要进行更改时,更改引入bug的可能性更小。

最新更新