AS3 Лучшие практики для метода, который может возвращать два типа - PullRequest
3 голосов
/ 14 июня 2011

Я разрабатывал платформу для ActionScript 3 и столкнулся с особым сценарием, когда я хочу, чтобы метод мог возвращать либо AvFrameworkObject, либо Array, содержащий несколько экземпляров AvFrameworkObject.

Возьмите этот метод, который используется для регистрации одного или нескольких экземпляров AvFrameworkObject:

public function register(...objects):Object
{
    var reg:Array = [];

    var i:AvFrameworkObject;
    for each(i in objects)
    {
        i.fw = this;
        reg.push(i);
    }

    return reg.length > 1 ? reg : reg[0];
}

Несколько вещей на вышесказанном:

  1. Это кажется мне крайне неаккуратным. Это правда?
  2. Я мог бы также использовать подстановочный знак (звездочка *) в качестве возвращаемого типа, что имеет больше смысла?
  3. Можно ли на самом деле определить только два типа возврата ? Просто для удобства чтения и т. Д.

Ответы [ 3 ]

4 голосов
/ 14 июня 2011
  1. В некотором строгом смысле, да, это может быть неаккуратным, но я видел намного хуже.

  2. У вас всегда должен быть как можно более узкий тип возвращаемого значения,Так что * в качестве возвращаемого типа хуже IMO, чем Object.

  3. Нет, вы не можете иметь два возвращаемых типа.

Если у вас есть хорошиепроверяет и документирует это хорошо, тогда его можно использовать.

Но как насчет того, чтобы всегда возвращать массив, если результат только 1, то вы возвращаете массив размером 1?

3 голосов
/ 16 июня 2011

Насколько я знаю, все объекты передаются по ссылке :

В ActionScript 3.0 все аргументы передаются по ссылке, поскольку все значения хранятся как объекты.Однако объекты, принадлежащие к примитивным типам данных, включая логические, Number, int, uint и String, имеют специальные операторы, которые заставляют их вести себя так, как если бы они были переданы по значению.

не нужно ничего возвращать, просто установка переменной fw будет работать.


При этом у вас есть несколько вариантов возврата нескольких переменных.

  • Общий подход состоит в том, чтобы вернуть счетчик возвращаемого массива и использовать аргумент для установки массива.Звонок будет как var length:int = register(out, object1, object2, object3).Затем вы можете использовать переменную length в цикле for.
  • Другой подход - вернуть весь массив.Я думаю, что это не нуждается в дополнительном объяснении, но я хочу прояснить, что вы можете использовать возвращенный массив напрямую, если вам нужен конкретный член.Например, если вы хотите первый объект, вы можете написать t:Thing = fw.register(new Thing())[0];.Обратите внимание на [0] в конце.
  • Вы также можете использовать вышеуказанные методы, но используйте Object insted из Array.

ЛичноЯ не предпочитаю возвращать абстрактный объект, обычно я решаю вернуть весь массив.

Надеюсь, это поможет.

0 голосов
/ 14 июня 2011

Лично в этом случае я бы вернул массив из 1 элемента для согласованности. Это сделает интерфейс более понятным; вызывающая сторона всегда может ожидать, что ей будет возвращен массив, вместо того, чтобы делать код более запутанным, реагируя по-разному на разные возвращаемые объекты.

Теперь также существует ситуация, когда код будет точно так же реагировать на возвращаемый объект независимо от его типа, и в этом случае это означает, что возвращаемые объекты унаследованы от некоторого общего базового класса. В этом случае тип возвращаемого значения должен быть общим базовым классом.

(Полагаю, здесь я предполагаю, что вы не будете точно так же реагировать на Array и AvFrameworkObject)

...