условная компиляция в Flex (Actionscript) и инструкции импорта

#apache-flex #actionscript-3 #air

#apache-flex #actionscript-3 #air

Вопрос:

У меня есть веб-приложение, написанное на Flex, и я пытаюсь создать приложение AIR из той же кодовой базы, используя условную компиляцию.

В приложении AIR мне нужны инструкции импорта, такие как следующие: импорт flash.data.SqlConnection; импорт flash.filesystem.Файл; но я не могу использовать эти инструкции импорта в веб-приложении, потому что они являются классами только AIR.

Я думал, что смогу использовать условную компиляцию для решения этой проблемы, но затем я прочитал следующее на странице http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7abd.html : «Вы не можете использовать постоянные логические значения для обусловливания метаданных или инструкций импорта».

Если это так, как я могу иметь общую кодовую базу для веб-приложений на основе Flex, а также для настольных приложений? Кто-нибудь решил эту головоломку?

Спасибо,

Dilip

Подробнее об этом вопросе после некоторых проб и ошибок… У меня есть 3 проекта в Eclipse для этого проекта… одна для веб-приложения, одна для приложения AIR и одна для общего исходного кода. В проекте web и AIR я указываю на общий исходный код. В обычном коде я использовал условную компиляцию, и, похоже, вы можете сделать что-то вроде следующего: CONFIG::desktopMode { импортировать flash.data.SqlConnection; импортировать flash.events.SQLEvent; импортировать flash.события.SQLErrorEvent; импортируйте flash.файловую систему.Файл; }

и аналогичный подход для включения веб-или AIR-специфичных функций во время компиляции. До сих пор этот подход, похоже, работал!

Единственное место, где я столкнулся с проблемами, — это в моем локаторе моделей Cairngorm. Если я помещаю CONFIG::desktopMode вокруг инструкций импорта в локаторе моделей Cairngorm, он начинает выдавать ошибку «Неперехваченное исключение в компиляторе» или «классы 1131 не должны быть вложенными». Я не уверен, как устранить эту ошибку!

Dilip

Ответ №1:

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

Комментарии:

1. @J_A_X, Согласен. И что касается меня, я бы предпочел извлекать зависящий от платформы код в отдельные классы с общим интерфейсом. И используйте эти классы путем внедрения интерфейса в конкретную реализацию с использованием некоторого контейнера для внедрения зависимостей или каким-либо другим способом (как вы описали в своем ответе).

Ответ №2:

Обычная «кодовая база» на самом деле не является ситуацией. Ваша общая кодовая база — это views и тому подобное, но с вашего Flex на ваше приложение Air ваш бизнес-уровень меняется. Для этого я бы порекомендовал вам создать 2 разных проекта (один для web, другой для air) и создать проект библиотеки для всех общих компонентов, классов, чего угодно, которые могут быть разделены между ними.

Невозможно иметь класс, подобный вашему, который говорит: «если flex, используйте только этот код; если air, используйте этот», поскольку air SDK добавляет дополнительную функциональность, и просто сказать «импортировать это» не сработает, потому что вам также нужно удалить все ссылки на этот импорт, что делает его нечитаемым.

Вам необходимо правильно спроектировать свой проект, чтобы вы могли отделять и абстрагировать большинство классов, чтобы их можно было использовать для обоих проектов, а затем в рамках каждого проекта иметь свою конкретную реализацию. Использование платформы приложений, такой как Parsley, может помочь вам достичь этого; Я знаю, что это помогло мне.

Ответ №3:

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