Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Оценить эту запись

Идиотизмы: с чем готовить haXe для флэш-гурмана?

Запись от BlooDHounD размещена 15.06.2010 в 05:03
Обновил(-а) BlooDHounD 15.06.2010 в 09:59

для понимания материала необходимы следующие знания:
haXe


haXe по свей идеологии остался на уровне AS2. хотя он и умеет компилировать в AVM2-байткод, до AS3 ему ещё очень далеко:
  • отсутствие namespace'ов
  • отсутствие internal в каком либо виде
  • отсутствие private как сущности: всё является protected
  • отсутствие констант
кроме недостатков самого языка есть более важные минусы:
  • после компиляции напрочь исчезают private и становятся public
  • отсутвие нативных getter/seeter'ов, которые превращаются в обычные методы
последние 2 пункта приводят к жутким последствиям. при использовании swc/swf во флэше, мы получаем полный доступ к классу. никакой инкапсуляции, и как следствие полный бардак в классе после компиляции.

данное упущение объясняется партией в лице генсека Cannasse приблизительно так:
приваты честно работают на этапе компиляции. и если вы чего-то пишете на haXe, то приваты остаются приватами, и все счастливы. если вы генерите swc/swf, это приравнивается к компиляции ехе и, соответственно, претензии к содержимому выходного файла не обоснованы. исправляться данная ситуация в угоду флэшерам не будет, ибо целевая аудитория проекта — разработчики haXe а не AS3.

но есть у данного компилятора и огромные плюсы:
при помощи этих нехитрых знаний я написал свою "чистую" библиотеку с некоторыми ресурсоёмкими алгоритмами.

рассмотрим все тонкости "чистой" интеграции haXe в ActionScript на примере класса JPEGEncoder.

основная проблема это отсутствие private. это значит, что все наши методы станут публичными и тем самым испортят выходной класс. даже если мы будем использовать inline ( а мы будем его использовать ), оригинальные методы всё равно будут включены. но если использовать mxmlc, то мы можем исключить не нужные классы. если мы вынесем все inline-методы в левый класс, то сможем этот класс исключить.
Код AS3:
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 {
		// ...
	}
 
}
если весь функционал мы поместим в класс TMP в виде inline-методов, то класс JPEGEncoder не будет ни с чем связан, и можно будет исключить класс TMP.

правда есть пару нюансов: нам нельзя использовать цикл for и свойства.
со свойствами всё понятно, а вот с циклом видимо бага. при использовании for вместо while иногда происходит использование класса TMP, и без него основной класс выкидывает исключение из-за отсутствие оного. с чем это связанно, я так и не понял. но использовать while вместо for никаких трудностей не вызывает.

но для работы JPEGEncoder'а необходимы предварительно рассчитанные таблицы значений, которые не хотелось бы рассчитывать каждый раз. приватов у нас нету, а значит надо выкручиваться. для этого я написал класс JPEGTable на AS3. но использовать его в haXe просто так не удастся. для возможности использовать класс, я написал заглужку на haXe используя ключевое слово extern. оно обозначает, что класс определён зарание. выглядит это как обычный interface
Код AS3:
package by.blooddy.crypto.image;
 
import flash.utils.ByteArray;
 
extern class JPEGTable {
 
	public static function getTable(?quality:UInt=60):ByteArray;
 
}
после генерации swc класс в ней отсутствует, но во время компиляции через mxmlc мы туда добавляем наш AS-класс. и всё работает как часы. в самом классе в статических свойствах хранятся таблицы.

все методы объявленные как inline добавляют к нашему приложению крупицу производительности. но основной прирост мы получаем за счёт использования скрытых операторов находящихся в классе Memory. тесты показывают, что записи и чтение при помощи данных операторов выше чем у аналогичных действиях с вектором или массивом. поэтому при портировании алгоритма мы заменяем все массивы и векторы с числами на работу с памятью.
при выделении памяти нельзя забывать, что в процессе работы приложения её может использовать кто-то другой, а значит надо не забыть вернуть её в первозданный вид.

в результате получаем то, что получаем.
Вложения
Тип файла: zip src.zip (8.7 Кб, 251 просмотров)
Всего комментариев 4

Комментарии

Старый 16.06.2010 15:28 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ну я уже как-то говорил, что в том же C# тоже по-настоящему нету приватов - т.как любой метод можно вызвать через рефлекшн, и как-то никто от этого не умер. А по поводу неймспейсов - ну, я не знаю, дело вкуса. Есть люди, которые будут так же яросно бить себя пяткой в грудь пытаясь доказать, что от них вреда больше чем пользы.
Старый 16.06.2010 16:16 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, одно дело возможность вызвать через рефлекшен, а другое работа с swc при помощи автокомплитов.
Старый 16.06.2010 19:21 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Так HaXe вроде ж как позволяет метадату добавлять? попробуй что-то типа @exclude - точно не знаю формат.
Старый 16.06.2010 19:39 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, и куда оно из автокомплита исчезнет? к тому же я фанат строгого подхода. даже если оно исчезнет из автокомплита, оно не исчезнет в принципе.
 

 


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


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