Один дешевый и грязный путь состоял бы в том, чтобы проверить как это:
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");
Единственное попадание должно быть во время компиляции, но 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 не облажался;)
Нет абсолютно никакой разницы в скомпилированном коде, импортируете ли вы весь пакет или только классы, которые вы используете. Импорт просто важен для компилятора, чтобы найти, где находятся классы.
Вы можете попробовать декомпилировать или посмотреть байт-код до и после.
В спецификации 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 КБ, поэтому я, вероятно, импортировал эти классы где-то еще, и успех был не очень большим. Готов поспорить, чем меньше ваше приложение, тем больше будет влияние на размер вашей компиляции (в процентном отношении).
Как и в случае с большинством языков, накладные расходы на производительность, связанные с импортом целых пакетов, а не отдельных классов, минимальны или отсутствуют.
Однако это более хорошая практика, поскольку она дает гораздо более краткий обзор зависимостей для вашего класса
Хорошая практика в целом - иметь код, который можно читать ... иметь начало класса с 200 операторов импорта, поэтому было бы довольно плохой практикой ...
в as3, операторе импорта только добавляет новую область видимости к разрешению идентификатора компилятора ... то, что скомпилировано в SWF, а что нет, определяется не операторами импорта, а фактическими зависимостями, то есть кодом из класса A с использованием класса B ...
поэтому во время выполнения не имеет значения, как вы импортировали свои классы ...
greetz
back2dos
Вы можете точно проверить, какие классы импортируются, используя параметр компилятора 'link-report'
Компилятору может потребоваться больше времени, чтобы разобраться, что именно включать, а что не включать, но если вы посмотрите отчеты о ссылках, вы заметите, что они включают только то, что они используют. :)
Обращаясь к пунктам Райндея, я не могу объяснить лишние 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, о котором говорилось в посте Ряндая.