Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиотизмы: с чем готовить haXe для флэш-гурмана?
для понимания материала необходимы следующие знания:
haXe
haXe по свей идеологии остался на уровне AS2. хотя он и умеет компилировать в AVM2-байткод, до AS3 ему ещё очень далеко:
- отсутствие namespace'ов
- отсутствие internal в каком либо виде
- отсутствие private как сущности: всё является protected
- отсутствие констант
- после компиляции напрочь исчезают private и становятся public
- отсутвие нативных getter/seeter'ов, которые превращаются в обычные методы
данное упущение объясняется партией в лице генсека Cannasse приблизительно так:
приваты честно работают на этапе компиляции. и если вы чего-то пишете на haXe, то приваты остаются приватами, и все счастливы. если вы генерите swc/swf, это приравнивается к компиляции ехе и, соответственно, претензии к содержимому выходного файла не обоснованы. исправляться данная ситуация в угоду флэшерам не будет, ибо целевая аудитория проекта — разработчики haXe а не AS3.
но есть у данного компилятора и огромные плюсы:
- возможность использовать inline
- возможность использовать операторы для работы с памятью
при помощи этих нехитрых знаний я написал свою "чистую" библиотеку с некоторыми ресурсоёмкими алгоритмами.
рассмотрим все тонкости "чистой" интеграции haXe в ActionScript на примере класса JPEGEncoder.
основная проблема это отсутствие private. это значит, что все наши методы станут публичными и тем самым испортят выходной класс. даже если мы будем использовать inline ( а мы будем его использовать ), оригинальные методы всё равно будут включены. но если использовать mxmlc, то мы можем исключить не нужные классы. если мы вынесем все inline-методы в левый класс, то сможем этот класс исключить.
package by.blooddy.crypto.image; import flash.display.BitmapData; import flash.utils.ByteArray; class JPEGEncoder { public static function encode(image:BitmapData, ?quality:UInt=60):ByteArray { return TMP.encode( image, quality ); } } private class TMP { public static inline function encode(image:BitmapData, quality:UInt):ByteArray { // ... } }
правда есть пару нюансов: нам нельзя использовать цикл for и свойства.
со свойствами всё понятно, а вот с циклом видимо бага. при использовании for вместо while иногда происходит использование класса TMP, и без него основной класс выкидывает исключение из-за отсутствие оного. с чем это связанно, я так и не понял. но использовать while вместо for никаких трудностей не вызывает.
но для работы JPEGEncoder'а необходимы предварительно рассчитанные таблицы значений, которые не хотелось бы рассчитывать каждый раз. приватов у нас нету, а значит надо выкручиваться. для этого я написал класс JPEGTable на AS3. но использовать его в haXe просто так не удастся. для возможности использовать класс, я написал заглужку на haXe используя ключевое слово extern. оно обозначает, что класс определён зарание. выглядит это как обычный interface
package by.blooddy.crypto.image; import flash.utils.ByteArray; extern class JPEGTable { public static function getTable(?quality:UInt=60):ByteArray; }
все методы объявленные как inline добавляют к нашему приложению крупицу производительности. но основной прирост мы получаем за счёт использования скрытых операторов находящихся в классе Memory. тесты показывают, что записи и чтение при помощи данных операторов выше чем у аналогичных действиях с вектором или массивом. поэтому при портировании алгоритма мы заменяем все массивы и векторы с числами на работу с памятью.
при выделении памяти нельзя забывать, что в процессе работы приложения её может использовать кто-то другой, а значит надо не забыть вернуть её в первозданный вид.
в результате получаем то, что получаем.
Всего комментариев 4
Комментарии
![]() ![]() |
|
wvxvw, одно дело возможность вызвать через рефлекшен, а другое работа с swc при помощи автокомплитов.
|
![]() ![]() |
|
Так HaXe вроде ж как позволяет метадату добавлять? попробуй что-то типа @exclude - точно не знаю формат.
|
![]() ![]() |
|
wvxvw, и куда оно из автокомплита исчезнет? к тому же я фанат строгого подхода. даже если оно исчезнет из автокомплита, оно не исчезнет в принципе.
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc до версии 0.5.1 (31.03.2016)
- Кто не успел - тот опоздал (19.04.2011)
- Обновление blooddy_crypto.swc до версии 0.3.1 (29.11.2010)
- blooddy_crypto.swc теперь умеет JSON (13.10.2010)
- Загадочный CommaExpression (06.09.2010)