Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更好的面向对象设计?_C# - Fatal编程技术网

C# 更好的面向对象设计?

C# 更好的面向对象设计?,c#,C#,我有一个类需要访问另一个类中声明的全局对象。可能有一些关键字,比如extern,可以让我这样做。我应该这样做,还是最好创建一个静态的“GlobalObjects”类,让我的所有类都可以访问并只访问对象:GlobalObjects.Object1.foo() 代码段: namespace Pong { public class Pong : Game { public Ball ball; public Paddle paddleOne;

我有一个类需要访问另一个类中声明的全局对象。可能有一些关键字,比如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”的设计模式,它经常在中使用。模式很简单:创建一个
注册表
类,该类本质上是一个静态列表(或一组静态列表),其中包含需要相互交互的所有元素


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

对前面对这个问题的评论/回答进行一点扩展。我同意全局状态通常表示设计不好。状态通常保存在数据存储中,因此可以根据需要进行访问。Oop设计意味着对象遵循一组原则,例如。同时,一个行为存在于一个且仅存在于一个类中


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

public
。@PrestonGuillot:那就把我所有的类都公开,或者让一个公共类可以访问所有的东西吧?@PrestonGuillot:我已经公开了对象和主类,但是我仍然无法访问主类内的对象,因为我没有它的实例|如果对象未绑定到实例,则将其设置为静态?OP尝试采用的方法可能会严重违反德米特定律。@SimonWhitehead是的,注册表模式故意违反最少知识原则。如前所述,对于严格遵守此类指南不合理或因项目规模过大而成本过高的情况,这是一种有意识的权衡。正如一个简单的待办事项列表应用程序不需要三层设计一样,一个简单的乒乓球游戏并不总是需要有完美的可视范围和关注点分离。即使有注册表,最好不要使用静态成员/列表等