C# 引用和修改Game1是一种糟糕的做法吗?

C# 引用和修改Game1是一种糟糕的做法吗?,c#,xna,C#,Xna,我需要从不同的类中更改多个Game1变量。我一直这样做: public class Game1 : Microsoft.Xna.Framework.Game { public int test1; public int test2; } public class Player { public Player(Game1 game) { game.test1 = 5;

我需要从不同的类中更改多个Game1变量。我一直这样做:

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        public int test1;
        public int test2;
    }


    public class Player
    {
        public Player(Game1 game)
        {
            game.test1 = 5;
            game.test2 = 10;
        }
    }
class Point { public int X; public int Y; public int Z; }
这是一种不好的做法吗?如果是,还有其他方法吗

这是一种不好的做法吗?如果是,还有其他方法吗

是和否。从一种类型修改另一种类型的状态通常是合适的

P>>说,使用两个公共领域来做这件事是我会考虑的不良做法。至少,您应该将这些属性切换为属性。如果“test1”和“test2”是相关的值,并且总是一起更改,那么提供一个公共方法将适合设置这些值

如图所示,使用公共字段的缺点是无法验证值。任何人(包括
Player
)都有可能将字段设置为不适当的值。如果您正在共享代码,还存在版本控制问题(例如,更改为属性是破坏API的更改)


您希望被其他类更改的任何状态(变量)都应该始终以您的类可以控制的方式公开。属性或方法允许您执行此操作。即使现在不需要这样做,为未来设计也是一种更好的做法。

根据您的需求,另一种选择是将这些变量作为静态对象存储在静态类中。然后,只要它们是同一项目的一部分,就可以从所有类访问它们

例如:

public static class Helper
{
    public static int test1;
    public static int test2;
}
用法:

public class Player
{
    public Player()
    {
        Helper.test1 = 5;
        Helper.test2 = 10;
    }
}

我很高兴您没有使用单例,也没有使一切
都是静态的

传递对“父”对象的引用是一种非常好的做法:使依赖关系清晰

但是,我不建议到处传递
Game1
引用。由于游戏中包含的对象通常比较大/复杂,因此会使每个对象的依赖关系/预期访问不明确(因为现在每个对象都可以接触游戏中的所有对象)。有时,在逻辑上将对象拆分为父容器更有意义:

public class Game1
{
    public readonly PlayerData playerData;
    public readonly EnemyData enemyData;
    //...
}
并对通过这些容器的访问进行更严格的控制。同样,这取决于您的范围/大小。

这与OOP的基本原则之一背道而驰。一个类通常应该负责管理自己的状态,而不是委派,或者更糟的是,与其他人分担这个责任。这只是一个指导方针,应该以正确的判断来遵循

抽象地说,这是您要支付的罚金:

  • 您引入的是双向绑定,而不是单向绑定 Game1和其他类。这使得您的设计更难推理 大约
  • 您将与其他类共享这些字段的责任。这意味着您不能简单地通过查看Game1类来确定 这些字段可以更改,但数量可以任意更改 上课
  • 每个引用Game1的类也可以更改这些变量。这意味着你的课程越多, 就越难推理这些变量是如何变化的 改变
  • 因为现在可以访问Game1的每个类都可以使用这些变量,所以删除它们或更改它们的类型变得非常重要 很难,因为现在你必须改变所有其他的课程 嗯
OOP就是将一个复杂的过程划分为单独的角色,这些角色可以很容易地单独进行推理。公共状态意味着共享状态,角色之间共享的越多,它们变得越模糊

有些情况下,公共字段是有意义的。例如,一个简单的3D点类可以如下所示:

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        public int test1;
        public int test2;
    }


    public class Player
    {
        public Player(Game1 game)
        {
            game.test1 = 5;
            game.test2 = 10;
        }
    }
class Point { public int X; public int Y; public int Z; }

这是可以的,因为类没有任何内部逻辑;它只是一个容器,只包含这三个密切相关的值。此类类的一个例子是XNA中的,它将其状态(X和Y)公开为公共字段。

作为对此答案的实用总结,您可以尝试许多方法:公开
SetTest1()
SetTest2()
(或使它们成为属性)是最基本的解决方案,但您也可以采取其他一些方法,例如,生成一个小规模的
消息
结构,由
Game1
接受,包含值,等等。最大的关注点是价值观何时以及由谁来改变,所以围绕这些关注点进行设计。