среда, 17 февраля 2010 г.

Сколько времени было потеряно!

Из серии "а мужики то не знают...". Оказывается условная компиляция в AS3 СУЩЕСТВУЕТ!
Сколько я убил времени на решение проблем, которые легко и непринужденно разруливаются с помощью старой, доброй, условной компиляции. Но в тот момент (три года назад) я нагуглил только то, что условной компиляции в AS НЕТ. Я не удивился, но огорчился. И с тех пор считал что её нет. А она, блин, уже есть(или была всегда?).

Зачем это надо? Первое и самое распространенное выкусывание из кода "отладочных" кусков. Чтобы при отладочной сборке этот код работал, а при релизной - нет. Второе и менее распространенное - когда один и тот же программный модуль имеет несколько различных вариантов использования. Например [что скоро станет сильно актуально] код, который должен компилиться под десктоп и под мобилу одновременно. Очевидно, что без модификации некоторых кусков кода это невозможно. И тогда можно будет помечать, что использовать под десктопом, а что под мобилой.

Пример использования:

в настройках компилятора пишем (Проект -> Свойства -> Компилятор Flex -> Дополнительные аргументы компилятора):

-define+=CONFIG::debugging,"false" -define+=CONFIG::release,"!CONFIG::debugging"

этим самым мы сказали компилятору что у нас будет две переменные условной компиляции:
CONFIG::debugging и CONFIG::release. Для CONFIG::debugging мы установили значение false. А переменную CONFIG::release мы задали как НЕ CONFIG::debug (логическое отрицание).

и далее кусок кода с использованием условной компиляции. Пусть это будет обработчик клика:

private function handlerClick(e:Event):void
{
CONFIG::debugging {
Alert.show("debug");
}
CONFIG::release {
Alert.show("rlease");
}
}


В зависимости от состояния переменных CONFIG::debugging и CONFIG::release обработчик будет скомпилен либо так:

private function handlerClick(e:Event):void
{
Alert.show("debug");
}

Либо так:

private function handlerClick(e:Event):void
{
Alert.show("release");
}

Сами переменные условной компиляции обзываются по правилу NAMESPACE::variable_name, где NAMESPACE и variable_name Вы вольны придумывать сами.

Пока я всё это писал mrDiestro прислал ссылку на сюда:
http://onenterframe.ru/2009/10/29/%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%B0-actionscript/
и на сюда:
http://groups.google.com/group/ruflash/browse_thread/thread/eb97256b7ebfcd0
Т.е. тема обширно обсуждающаяся...а мужики то не знают...

ЗЫ:
Вопрос к знающим мужикам, как минимальными усилиями сделать два конфига для компилера(в flex builder ide) - дебаг конфиг и релиз конфиг, чтобы по кнопке Export Release подсасывался релизный конфиг, а при обычном билде - дебажный ?