Пакет импорта Actionscript 3.* по сравнению с пакетом импорта. Класс

Один дешевый и грязный путь состоял бы в том, чтобы проверить как это:

isset($myArray[count($myArray) - 1])

... Вы могли бы получить ложь, положительную, если Ваш массив похож на это:

$myArray = array("1" => "apple", "b" => "banana");

А более полный путь мог бы состоять в том, чтобы проверить ключи:

function arrayIsAssociative($myArray) {
    foreach (array_keys($myArray) as $ind => $key) {
        if (!is_numeric($key) || (isset($myArray[$ind + 1]) && $myArray[$ind + 1] != $key + 1)) {
            return true;
        }
    }
    return false;
}
// this will only return true if all the keys are numeric AND sequential, which
// is what you get when you define an array like this:
// array("a", "b", "c", "d", "e");

или

function arrayIsAssociative($myArray) {
    $l = count($myArray);
    for ($i = 0; $i < $l, ++$i) {
        if (!isset($myArray[$i])) return true;
    }
    return false;
}
// this will return a false positive on an array like this:
$x = array(1 => "b", 0 => "a", 2 => "c", 4 => "e", 3 => "d");
15
задан Peiniau 11 August 2009 в 13:27
поделиться

7 ответов

Единственное попадание должно быть во время компиляции, но rday пишет, что это, по-видимому, небольшое попадание. Но это должно быть что-то, что Adobe исправит в будущем.

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

например, . Если вы создали собственный класс Point , и он использовался в другом пакете, компилятор должен знать, ссылаетесь ли вы на свой собственный класс Point или класс Adobe Point .

Альтернативой может быть написание полного имени каждый раз, когда вы обращаетесь к класс.

например. var mySprite: flash.display.Sprite = new flash.display.Sprite ();

Как указал Хуан Пабло Калифано в комментарии, на самом деле это не работает с компилятором ( хотя думаю, что с AS2 может работать). Я просто хотел указать, почему у нас есть оператор импорта для начала.

В любом случае он не должен влиять на скомпилированный файл, если вы импортируете весь пакет (хотя, по-видимому, это так). Однако это повлияет на время компиляции, поскольку вы даете компилятору больше информации, которую он должен просмотреть.

Что касается «импорта» одного и того же класса более одного раза. Это не имеет значения. Компилятор будет включать один и тот же класс только один раз. В противном случае размер скомпилированного файла быстро вышел бы из-под контроля, поскольку большинство классов относятся ко многим классам, которые снова относятся к другим и т. Д. Но, опять же, Adobe могла бы провести оптимизацию, чтобы сделать это.

Суть в том, что вам следует импортировать только то, что вы необходимости, нет никаких реальных преимуществ в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, может ли импорт внешнего пакета включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Компилятор будет включать один и тот же класс только один раз. В противном случае размер скомпилированного файла быстро вышел бы из-под контроля, поскольку большинство классов относятся ко многим классам, которые снова относятся к другим и т. Д. Но, опять же, Adobe могла бы провести оптимизацию, чтобы сделать это.

Суть в том, что вам следует импортировать только то, что вы необходимости, нет никакого реального преимущества в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, может ли импорт внешнего пакета включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Компилятор будет включать один и тот же класс только один раз. В противном случае размер скомпилированного файла быстро вышел бы из-под контроля, поскольку большинство классов относятся ко многим классам, которые снова относятся к другим и т. Д. Но, опять же, Adobe могла бы провести оптимизацию, чтобы сделать это.

Суть в том, что вам следует импортировать только то, что вы необходимости, нет никаких реальных преимуществ в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, может ли импорт внешнего пакета включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

В противном случае размер скомпилированного файла быстро вышел бы из-под контроля, поскольку большинство классов относятся ко многим классам, которые снова относятся к другим и т. Д. Но, опять же, Adobe могла бы провести оптимизацию, чтобы сделать это.

Суть в том, что вам следует импортировать только то, что вы необходимости, нет никаких реальных преимуществ в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, что импорт внешнего пакета может включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

В противном случае размер скомпилированного файла быстро вышел бы из-под контроля, поскольку большинство классов относятся ко многим классам, которые снова относятся к другим и т. Д. Но, опять же, Adobe могла бы провести оптимизацию, чтобы сделать это.

Суть в том, что вам следует импортировать только то, что вы необходимости, нет никаких реальных преимуществ в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, может ли импорт внешнего пакета включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Adobe, возможно, потребует оптимизацию для этого.

В итоге вы должны импортировать только то, что вам нужно, нет никакого реального преимущества в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, что импорт внешнего пакета может включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Adobe, возможно, потребует оптимизацию для этого.

В итоге вы должны импортировать только то, что вам нужно, нет никакого реального преимущества в импорте всего пакета. Просто используйте подходящий инструмент кодирования, например FlashDevelop (это бесплатно), и вам даже не нужно писать операторы импорта самостоятельно.

Кстати, если вы компилируете библиотеку (где класс не упоминаются также включены), я не уверен, может ли импорт внешнего пакета включать его в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Кстати, если вы компилируете библиотеку (в которую также включаются классы, на которые не ссылаются), я не уверен, может ли импорт внешнего пакета включать это в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

Кстати, если вы компилируете библиотеку (в которую также включены классы, на которые не ссылаются), я не уверен, может ли импорт внешнего пакета включать это в ваш скомпилированный файл. Это могло иметь реальное влияние; хотя, надеюсь, Adobe не облажался;)

7
ответ дан 1 December 2019 в 04:27
поделиться

Нет абсолютно никакой разницы в скомпилированном коде, импортируете ли вы весь пакет или только классы, которые вы используете. Импорт просто важен для компилятора, чтобы найти, где находятся классы.

Вы можете попробовать декомпилировать или посмотреть байт-код до и после.

1
ответ дан 1 December 2019 в 04:27
поделиться

В спецификации ActionScript 3 говорится, что все общедоступные имена из пакета будут импортированы, если вы используете '*'. Итак, есть хит, хотя он может быть не большим, в зависимости от размера упаковки. Книга Шаблоны проектирования ActionScript также не одобряет этого из-за лишнего багажа, а также некоторые советы Adobe ActionScript .

При этом я использовал один как компонент в приложении, которое я написал и

  import mx.containers.*;
  import mx.events.*;
  import mx.managers.*;

Вместо одного имени класса. У меня размер увеличился на 3 байта. Теперь все приложение занимает 935 КБ, поэтому я, вероятно, импортировал эти классы где-то еще, и успех был не очень большим. Готов поспорить, чем меньше ваше приложение, тем больше будет влияние на размер вашей компиляции (в процентном отношении).

Я взял один как компонент в написанном мной приложении и

  import mx.containers.*;
  import mx.events.*;
  import mx.managers.*;

вместо отдельных имен классов. У меня размер увеличился на 3 байта. Теперь все приложение занимает 935 КБ, поэтому я, вероятно, импортировал эти классы где-то еще, и успех был не очень большим. Готов поспорить, чем меньше ваше приложение, тем больше будет влияние на размер вашей компиляции (в процентном отношении).

Я взял один как компонент в написанном мной приложении и

  import mx.containers.*;
  import mx.events.*;
  import mx.managers.*;

вместо отдельных имен классов. У меня размер увеличился на 3 байта. Теперь все приложение занимает 935 КБ, поэтому я, вероятно, импортировал эти классы где-то еще, и успех был не очень большим. Готов поспорить, чем меньше ваше приложение, тем больше будет влияние на размер вашей компиляции (в процентном отношении).

1
ответ дан 1 December 2019 в 04:27
поделиться

Как и в случае с большинством языков, накладные расходы на производительность, связанные с импортом целых пакетов, а не отдельных классов, минимальны или отсутствуют.

Однако это более хорошая практика, поскольку она дает гораздо более краткий обзор зависимостей для вашего класса

0
ответ дан 1 December 2019 в 04:27
поделиться

Хорошая практика в целом - иметь код, который можно читать ... иметь начало класса с 200 операторов импорта, поэтому было бы довольно плохой практикой ...

в as3, операторе импорта только добавляет новую область видимости к разрешению идентификатора компилятора ... то, что скомпилировано в SWF, а что нет, определяется не операторами импорта, а фактическими зависимостями, то есть кодом из класса A с использованием класса B ...

поэтому во время выполнения не имеет значения, как вы импортировали свои классы ...

greetz

back2dos

0
ответ дан 1 December 2019 в 04:27
поделиться

Вы можете точно проверить, какие классы импортируются, используя параметр компилятора 'link-report'

Компилятору может потребоваться больше времени, чтобы разобраться, что именно включать, а что не включать, но если вы посмотрите отчеты о ссылках, вы заметите, что они включают только то, что они используют. :)

1
ответ дан 1 December 2019 в 04:27
поделиться

Обращаясь к пунктам Райндея, я не могу объяснить лишние 3 байта, но несколько примечаний ...

Книга шаблонов проектирования ActionScript также не одобряет это из-за лишнего багажа

Да, на странице 115, но я думаю, что это неправильно, и внесены исправления по этому поводу.

В спецификации ActionScript 3 сказано, что все общедоступные имена из пакета будут импортированы, если вы используете '*'. Так что хит есть,

вроде как, но я не согласен с интерпретацией и хитом. В нем говорится: «Имена элементов пакета сделаны видимыми ...» ( полностью ). В этом контексте это относится к тому, чтобы сделать имена членов видимыми для инструментов компилятора и редактора, не видимыми в скомпилированном SWF. то есть не означает, что классы компилируются в SWF - если они не используются на самом деле (объявленная переменная этого типа).

Другой способ взглянуть на это: вы можете вручную импортировать flash.display.MovieClip . Но если вы не создадите ни одного экземпляра MovieClip, класс MovieClip не будет скомпилирован в окончательный SWF-файл.

Чтобы убедиться в этом, я скомпилировал следующий helloworld тремя способами, выводя отчет о ссылках, как это было предложено @secoif ...

package
{
    import flash.display.Sprite;
    import flash.text.TextField;

    public class ASHelloWorld extends Sprite
    {
        public function ASHelloWorld()
        {
            var tf:TextField = new TextField();
            tf.text = "Hello World!";
            addChild( tf );
        }
    }
}

Во-первых, как написано, отчет по ссылкам:

<report>
  <scripts>
    <script name="~/Documents/eclipse3.5carbonFbPlugin-FX4-LS10/ASHelloWorld/src/ASHelloWorld.as" mod="1278415735000" size="682" optimizedsize="344">
      <def id="ASHelloWorld" />
      <pre id="flash.display:Sprite" />
      <dep id="AS3" />
      <dep id="flash.text:TextField" />
    </script>
  </scripts>
  <external-defs>
    <ext id="AS3" />
    <ext id="flash.text:TextField" />
    <ext id="flash.display:Sprite" />
  </external-defs>
</report>

Во-вторых, удалите файл отчета по ссылкам и измените импорт на:

    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.text.TextField;

Чистая сборка, и отчет по ссылкам выглядит точно так же.Одинаковый размер, такая же оптимизация, одинаковые связанные классы.

В-третьих, удалите файл отчета по ссылкам и измените импорт на:

    import flash.display.*;
    import flash.text.*;

Чистая сборка, и отчет по ссылкам будет выглядеть точно так же. Одинаковый размер, такая же оптимизация, одинаковые связанные классы.

В каждом случае в SWF попадают только классы Sprite и TextField.

Если посмотреть на фактический размер SWF-файла на диске, кажется, что есть небольшое отклонение (1 или 2 байта) по сравнению с 3 версиями. Не хуже, чем для более крупного SWF, о котором говорилось в посте Ряндая.

5
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: