2

我需要从不同的类更改多个 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;
        }
    }

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

4

4 回答 4

8

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

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

话虽如此,使用两个公共领域来做到这一点是我认为不好的做法。至少,您应该将这些切换到属性。如果“test1”和“test2”是相关值,并且总是一起更改,则提供一个公共方法将适合设置这些值。

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

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

于 2013-04-04T16:21:39.070 回答
2

我很高兴你没有使用单例,或者制作所有东西static

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

但是,我不建议在Game1任何地方简单地传递引用。由于游戏通常就其包含的对象而言相对较大/复杂,因此它可能使每个对象的依赖关系/预期访问不清楚(因为现在每个对象都可以触及游戏中的所有内容)。有时将对象逻辑拆分到父容器中会更有意义:

public class Game1
{
    public readonly PlayerData playerData;
    public readonly EnemyData enemyData;
    //...
}

并通过这些容器更严格地控​​制访问。同样,这取决于您的范围/大小。

于 2013-04-04T18:04:14.000 回答
0

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

例如:

public static class Helper
{
    public static int test1;
    public static int test2;
}

用法:

public class Player
{
    public Player()
    {
        Helper.test1 = 5;
        Helper.test2 = 10;
    }
}
于 2013-04-04T17:59:03.837 回答
0

它违背了信息隐藏,这是 OOP 的基本原则之一。一个类通常应该负责管理自己的状态,而不是委托,或者更糟的是,与其他人分担这个责任。这只是一个指导方针,应遵循适当的判断。

在摘要中,这是您要支付的罚款:

  • 您在 Game1 和另一个类之间引入了一种双向绑定,而不是单向绑定。这使您的设计更难推理。
  • 您正在与另一个班级分担这些领域的责任。这意味着您不能简单地查看 Game1 类来确定这些字段如何更改,而是查看任意数量的类。
  • 每个将引用 Game1 的类也将能够更改这些变量。这意味着您拥有的类越多,就越难推断这些变量如何变化。
  • 由于现在可以访问 Game1 的每个类都可以使用这些变量,因此删除它们或更改它们的类型变得非常困难,因为现在您还必须更改所有这些其他类。

OOP 就是将一个复杂的过程划分为不同的角色,这些角色可以很容易地在孤立的情况下进行推理。公共状态意味着共享状态,角色之间共享的越多,它们就越模糊。

在某些情况下,公共领域是有意义的。例如,一个简单的 3D Point 类可能如下所示:

class Point { public int X; public int Y; public int Z; }

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

于 2013-04-04T21:15:25.070 回答