Использование -1 в качестве специального значения в функциях API, принимающих числовые аргументы - PullRequest
1 голос
/ 22 июня 2011

Рассмотрим этот пример функции из API игрового движка:

function Entity.SetHealth( Number health )
  • Разве плохо, когда такие функции принимают -1 в качестве параметра, в результате чего в этом случае сущность становится непобедимой?

  • Стоит ли использовать две дополнительные функции: Entity.SetInvincible и Entity.GetInvincible?

Обратите внимание, что этот пример с непобедимостью и здоровьем на самом деле только что составлен мной.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Магические числа, как правило, плохой знак, но я бы не сказал, что вы должны их запретить.Другими словами, если -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 > *
    ...
1 голос
/ 22 июня 2011

Есть много худших вещей, которые вы можете сделать, и я вижу, что именно такой подход довольно часто используется во многих игровых движках и инфраструктурах пользовательского интерфейса для различных задач (например, в команде повторить движение, установив повторения в-1 означает «повторить навсегда»).Если вы понимаете все остальное в основном правильно, то критиковать этот выбор дизайна было бы просто придиркой.

Тем не менее, семантика неинтуитивна (-1 непобедима?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...