引用和修改Game1的不良做法?

时间:2013-04-04 16:19:33

标签: 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;
            game.test2 = 10;
        }
    }

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

4 个答案:

答案 0 :(得分:8)

  

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

是和否。通常可以从一种类型中修改另一种类型的状态。

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

如图所示,使用公共字段的缺点是您无法验证值。任何人(包括Player)都可以将您的字段设置为不合适的值。如果您要共享代码,还会出现版本问题(例如,更改为属性是API更改)。

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

答案 1 :(得分:2)

我很高兴你没有使用单身人士,也没有使用static

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

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

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

通过这些容器进行更严格控制的访问。同样取决于您的范围/尺寸。

答案 2 :(得分:0)

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

例如:

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

用法:

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

答案 3 :(得分:0)

它反对information hiding,这是OOP的基本原则之一。一般来说,一个班级应该负责管理自己的国家,而不是委托,或者更糟糕的是,与他人分担这一责任。这只是一个指导原则,应该遵循适当的判断。

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

  • 你介绍的是双向而不是单向绑定 Game1和其他类。这使您的设计难以推理 约。
  • 您要与其他班级分担这些字段的责任。这意味着你不能简单地看看Game1类来确定如何 这些字段可以改变,而是任意数量 类。
  • 每个将引用Game1的类也将能够更改这些变量。这意味着你拥有的课程越多, 理解这些变量如何变得越困难 变化。
  • 由于这些变量现在可以被每个可以访问Game1的类使用,因此删除它们或更改它们的类型变得非常 很难,因为现在你必须改变所有这些其他类 好。

OOP就是将复杂的流程划分为单独的角色,这些角色可以单独轻松推理。公共状态意味着共享状态,角色之间共享的越多,它们就越模糊。

有些公共领域可以理解。例如,一个简单的3D Point类可能如下所示:

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

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