Рубрика: AS3
Flex Mojos - A Maven Flex Plugin
Недавно вышел новый Flex Mojos - A Maven Flex Plugin. Если вы собираетесь внедрять maven, рекомендую к нему присмотреться.
Сборка приложения использующего BlazeDS, Spring, Hibernate. очень хорошо описана в наборе статей (Flex, Spring and BlazeDS: the full stack! part 1, part2 , part3, part4)
Flex + Maven часть1
Для сборки flex c помощью maven необходимо произвести следующие действия:
- установить MAVEN
- установить flex sdk
- создать файл проекта pom.xml
- настроить среду
- создать структуру проекта и Main.mxml
- запустить maven
Создание файла проекта pom.xml
плагин для сборки swf/swc http://www.israfil.net
пример pom.xml для flex
XML:
<?xml version="1.0" encoding="UTF-8"?> | |
<project xmlns="http://maven.apache.org/POM/4.0.0" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 | |
http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
| |
<name>test-flex-swf</name> | |
<groupid>test</groupid> | |
<artifactid>test-flex-swf</artifactid> | |
<version>1.0</version> | |
<modelversion>4.0.0</modelversion> | |
<description>test build flex with maven. | |
see: </description>">http://riapriority.com/blogs/agahov.php</description> | |
| |
<packaging>swf</packaging> | |
| |
<properties> | |
<flex .home>C:/FLEX_HOME/sdk/2.0.1</flex> | |
</properties> | |
<build> | |
<plugins> | |
<plugin> | |
<groupid>net.israfil.mojo</groupid> | |
<artifactid>maven-flex2-plugin</artifactid> | |
<extensions>true</extensions> | |
<configuration> | |
<flexhome>${flex.home}</flexhome> | |
<mainmxmlfile>Main.mxml</mainmxmlfile> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> | |
</project> |
Настройка среды
- flex.home в pom.xml должна ссылаться на flex sdk, которую вы хоти использовать для сборки
не забудте в файле $flex.home/frameworks/flex-config.xml отредактировать следующую строку:
winFonts.ser - для windows
macFonts.ser - для MAC
XML:
<flex -config> | |
<compiler> | |
<fonts> | |
<local -fonts-snapshot>---Fonts.ser</local> | |
</fonts> | |
</compiler> | |
</flex> |
Cтруктура проекта
project-name/pom.xml
project-name/src
project-name/src/main/
project-name/src/main/flex
project-name/src/test
project-name/src/main/flex/Main.mxml
Main.mxml может быть таким:
XML:
<?xml version="1.0" encoding="utf-8"?> | |
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> | |
<mx:Script> | |
<![CDATA[ | |
import mx.controls.Alert; | |
| |
private function start():void | |
{ | |
Alert.show("hi maven!"); | |
} | |
]]> | |
</mx:Script> | |
| |
<mx:Button click="start()"/> | |
</mx:Application> |
Сборка проекта с помощю maven
для сборки проекта зайдите в папку [project-name] и выполните команду: mvn pakage
Maven
Цели Maven
- Сделать процесс сборки лёгким
- Обеспечить унифицированную систему сборки
- Предоставить качественную информацию о проекте
- Дать руководство о лучших практиках разработки
- Обеспечить прозрачный переход к новым возможностям.
Конференция User Experience
8-10 ноября прошла конференция User Experience. Это направление охватывает создание и использование продукта в целом. Основная цель User Experience - полезность (valuable) продукта для конечного пользователя.
Доклады, которые хотелось бы выделить.
Клонирование объектов утилитой ObjectUtil.copy
Нам понадобилось клонировать объект. Для этого в as3 можно использовать утилиту ObjectUtil.copy. Метод ObjectUtil.copy(obj) возвращает копию исходного объекта obj. Это замечательно работает для невизуальных объектов.
Пример:
- package com.test
- {
- public class TestClass
- {
- public var index : int = 100;
- }
- }
- ...
- var testObject:TestClass = new TestClass();
- testObject.index = 98;
- var cloneTestObject : Object = ObjectUtil.copy(testObject);
- trace(“cloneTestObject.index : ” + cloneTestObject); // cloneTestObject.index : 98
- ...
Но есть ложка дегтя. Данная функция возвращает анонимный объект. И система не позволяет осуществить его приведение к исходному классу.
Данный код приведет к сбою в программе:
- ...
- var testObject:TestClass = new TestClass();
- testObject = 99;
- var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
- trace(“index: ”+ cloneTestObject.index);
- ...
После некоторых исследований и подсказки Константина Ковалёва, находим метод flash.net.registerClassAlias. Который и решает проблему:
- ...
- var testObject:TestClass = new TestClass();
- registerClassAlias(getQualifiedClassName(testObject), TestClass);
- var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
- ...
Для тех, кто хочет докопаться до сути процесса. В справке по registerClassAlias написано: «LocalConnection, ByteArray, SharedObject, NetConnection and NetStream are all examples of classes that encode objects in AMF.» Так как метод ObjectUtil.copy, использует ByteArray, то наш результирующий объект кодируется в формат AMF. Для восстановления класса объекта, используется функция flash.net.registerClassAlias.
Решение проблемы наследования от Point.
Проблема:
Допустим, сделал я интерфейс IVector:
- interface IVector{
- function get x () : Number;
- …
- }
Есть у меня класс утилита, который работает с этим интерфейсом:
- class VectorMath{
- public function calc(v:IVector):IVector
- {
- …
- }
- …
- }
Кульминация - нужно сделать реализацию IVector:
- class Vector implements IVector
- {
- private var _x : Number;
- public function get x () : Number
- {
- return _x;
- }
- …
- }
Если присмотреться к классу Vector, становиться понятно, что он очень похож на Point.
Что же делать, ведь в данной реализации наследовать Vector от Point нельзя. Включать Point в Vector тоже нехорошо, потому как мы потеряем поведение Point. И для всех системных утилит принимающих Point, придется делать преобразование.
Решение:
Перепишем интерфейс IVector:
- interface IVector
- {
- function get i () : Number;
- }
И реализация IVector будет иметь следующий вид:
- class Vector extends Point implements IVector
- {
- public function get i () : Number
- {
- //это не опечатка :)
- return super.x;
- }
- …
- }
Вот такая радость
. Сегодня придумал. Если вы увидели недостатки данного решения, очень прошу поделиться.
Публичные переменные в классе flash.geom.Point
Дополнение к посту «Публичные переменные это зло… »
Постараюсь более подробно раскрыть проблему реализации системного класса flash.geom.Point.
Изучим структуру flash.geom.Point:
- var myTestPoint : Point = new Point(9,9);
- trace(describeType(myTestPoint));
в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные
…
variable name="x” type="Number”
…
variable name="y” type="Number”
…
какие проблемы это вызывает?
Отсутствует возможность переопределить данные свойства в классе потомке.
Пример 1:
- Point;
- public class MyPoint extends Point
- {
- public function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1024: Overriding a function that is not marked for override.
Пример 2:
- package
- {
- import flash.geom.Point;
- public class MyPoint extends Point
- {
- public override function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1023: Incompatible override.
Следовательно для реализации, например, интерфейса IPoint
- package
- {
- public class IPoint
- {
- function set x (v : Number) : void;
- function get x () : Number;
- function set y (v : Number) : void;
- function get y () : Number;
- }
- }
нельзя использовать использовать наследование
- public class MyPoint extends Point implements IPoint
придется использовать делегацию:
- package
- {
- import flash.geom.Point;
- public class MyPoint implements IPoint
- {
- private var _point : Point;
- public function MyPoint ()
- {
- _point = new Point();
- }
- public function set x (v:Number):void
- {
- _point.x = v;
- }
- public function get x ():Number
- {
- return _point.x;
- }
- public function set y (v:Number):void
- {
- _point.y = v;
- }
- public function get y ():Number
- {
- return _point.y;
- }
- …
- }
- }
Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование.
Пример преобразования:
…
- var Rect:Rectangle = new Rectangle(0,0, 100, 100);
- Rect.offsetPoint( new Point(myPoint.x, myPoint.y) );
…
Пример обертки:
- package
- {
- import flash.geom.Rectangle;
- import flash.geom.Point;
- public class MyRectangle extends Rectangle
- {
- public function offsetIPoint ( point : IPoint)
- {
- offsetPoint (new Point ( point.x, point.y ));
- }