1

考虑来自虚构游戏引擎 API 的示例函数:

function Entity.SetHealth( Number health )
  • 让这样的函数接受作为参数是否很糟糕-1,在这种情况下,导致实体变得无敌?

  • 我是否应该使用两个额外的功能:Entity.SetInvincibleEntity.GetInvincible

注意,这个无敌健康的例子,真的是我自己编出来的。

4

2 回答 2

1

幻数通常是一个不好的迹象,但我不会说你应该禁止它们。换句话说,如果-1否则是非法值,您可以使用它,但我至少会为它创建一个常量,以便对该方法的调用如下所示:

someEntity.SetHealth(Health.Infinite)

或类似的,常量的命名取决于你。

但是,更好的方法(在我看来)是封装该值,为其提供额外的数据,例如,您可以在 C# 中创建这样的类型:

public struct Health
{
    private readonly int _Value;
    public int Value { get { return _Value; } }

    public Health(int value)
    {
        if (value < 0 || value > SOME_ARBITRARY_MAX_NUMBER)
            throw new ArgumentOutOfRangeException("value");
        _Value = value;
    }

    public static Health Infinite
    {
        get
        {
            Health result = new Health(0);
            result._Value = -1;
            return result;
        }
    }

    public bool IsInfinite
    {
        get
        {
            return _Value == -1;
        }
    }
}

然后,您还将添加必要的比较方法、运算符等,以便您可以执行以下操作:

Health a = Health.Infinite;
Health b = 100;               // automatic type coercion
if (b < a)                    // custom operator, knows that Infinite > *
    ...
于 2011-06-22T16:24:35.370 回答
1

你可以做很多更糟糕的事情,我在许多游戏引擎和 UI 框架中经常看到这种精确的方法,用于各种任务(例如,在重复动作的命令中,将重复设置为 -1 意味着“永远重复”)。如果你把其他所有的东西都做对了,那么批评这个设计选择就只是挑剔了。

也就是说,语义是不直观的(-1 是无敌的?嗯?)所以最好有额外的功能。

于 2011-06-22T16:21:56.637 回答