Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблемы с организацией модульности (http://www.flasher.ru/forum/showthread.php?t=143962)

AlliAS 30.08.2010 14:56

Проблемы с организацией модульности
 
Здравствуйте.

Уже 4 месяца разрабатываю проект, и пришел к выводу к данному моменту он слишком много стал весить и слишком долго компилироваться, поэтому возникла идея разделить его на модули. Поинтересовавшись как это можно сделать попробовал: вынес один из классов в отдельный FLA, вместе со связанными символами в библиотеке, сделал загрузчик, который получает определение класса из applicationDomain загружаемого модуля, и очень обрадовался когда обраружил что во первых все работает, а во вторых модуль очень быстро компилируеться. Думал "ух, наконецто не нужно будет компилировать проект целиком, как скорость разработки то увеличиться" (проект целиком копилируеться около 2х минут, и на это уходит больше часа в день), но внеся изменения в код, обнаружил, что изменеия при компиляции только модуля, без основного исходника, совершенно не происходят. Сначала не понимал в чем дело, но потом просмотрев код понял - судя по всему это из-за того, что в самом проекте я использую статические переменные класса, который ассоциирован с основным клипом модуля, думал что эта проблема решиться если ображаться к статическим переменным через ту, которой я присваиваю определение класса, но в этом случае при вызове модуля вылезает ошибка "невозможно вызвать объект со ссылко на null", и так везде где происходит обращение к статическим переменным.

Что я собственно хочу узнать, так это есть ли способ обращаться к статическим переменным класса, определение которого получено при окончинии загрузки, методом getDifinition. И если можно то как?

SunShadow 30.08.2010 15:22

Вынужден вас огорчить, если вы используете в обоих модулях один и тот же класс, то его изменение требует перекомпиляции обоих модулей, иначе результаты будут мягко говоря неадекватными. лучший способ использовать интерфейсы для обмена "тычками" между модулями. По идее если у вас есть статический метод(переменная, константа) как только он инициирован в текущем приложении то последующая загрузка любого элемента приводит к тому, что он будет использовать уже существующую ссылку.
Кстати просвятите что значит
Цитата:

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

AlliAS 30.08.2010 16:44

Код привести уже не могу, откатил исходники в svn до рабочего состояния, ошибки вылетали такие:
Код AS3:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

Кстати, а можно по подробнее про общение при помощи интерфесов? Я их еще не использовал, и честно мало представляю для чего они нужны, можно пример?

artcraft 30.08.2010 19:02

я напишу зачем нужны интерфейсы, а вы сами почитаете что они из себя представляют, ок?

у вас две флэшки приложение и подгружаемый модуль
например, у приложения есть метод say(val:String):void
а у модуля есть что сказать но нету метода say

задача: по просьбе приложения модуль должен вызвать метод say приложения

если у вас в приложении будут такие строки:
Код AS3:

var m:Module = createInstanceOf('module') as Module;
m.saySomething(this);

то определение класса Module будет вшито в основное приложение, а вы как раз пытаетесь вынести его в отдельный файл поэтому нужно использовать интерфейс:
Код AS3:

var m:IModule = createInstanceOf('module') as IModule;
m.saySomething(this);

в этом случае в приложение будет вшит только интерфейс а определение класса будет только в модуле

и аналогично в модуле, вам нужно сделать так чтобы класс приложения не вшивалcя в модуль, но чтобы была возможность вызывать методы приложения
Код AS3:

public function saySomething(app:IApp):void{
  app.say("Hello World");
}

таким образом в файл приложение вшито определения класса приложения и интерфейс общения с модулем, а в модуль определение класса модуля и интерфейс общения с приложением

-De- 30.08.2010 19:12

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

artcraft 30.08.2010 19:19

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

-De- 30.08.2010 19:30

Я не говорю, что не надо делить на модули вообще. Но вот подгружать модули с кодом уже сомнительная выгода, чтоб код много весил надо умудриться. Ассеты (графика, какие-то координаты, настройки) - да, заметно сокращаем время загрузки и используемую память. Кстати, флэшевые порталы по крайней мере недавно любили, чтоб игры шли одним swf.
Ну и где много кода компилить в CSX - всяко изврат)

artcraft 30.08.2010 19:54

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

AlliAS 30.08.2010 20:10

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

SunShadow 30.08.2010 21:05

Интерфейсы удобная штука в том плане, что позволяют вам задать отличительные признаки некоторого объекта, и чтобы объект мог реализовать этот интерфейс он должен реализовать все эти признаки(то бишь свойства и методы). Сами интерфейсы вы можете использовать как обычные переменные-объекты, обладающие указанными в интерфейсе признаками. И далее по тексту программы вы можете использовать такую переменную для работы как обычный объект.
например IMyIFace описывает что объект должен содержать методы
Код AS3:

function start(num:int):void;
function end():Boolean;
function get time():int;

тогда в некой функции мы можем сделать так
Код AS3:

private function (obj:Object):void {
  var needObj:IMyIFace = obj as IMyIFace;
  if (needObj){
    needObj.start(1250);
    trace ('Время ' + needObj.time);
  }
}

Иногда интерфейсы используют просто как маркеры, в таком случае они не описывают никаких свойств, а просто помечают объект что он принадлежит к некоему семейству. И в коде по маркеру-интерфейсу вы можете выделять необходимые объекты легко сравнивая их например так
Код AS3:

if (obj is IMyMarkerIface) {
  trace('ура это он');
}



Часовой пояс GMT +4, время: 10:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.