|
|
|||||
Цитата:
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
В принципе, да, самое оно.
Но правда данный метод не решает другую проблему, связанную не с самим кодом, а с процессом его создания. Возможно, это ламерство, но у меня в процессе отладки на каждый чих предусмотрен свой trace. Я за это и полюбил строковые идентификаторы, что при отсутствии полноценного Вью, я хотя бы в консоли хорошо читаю и понимаю, что происходит в моей Модели. И если вместо информативных строк начнут массово появляться нули и единицы, я перестану ориентироваться в происходящем.
__________________
Не сломано - не чини! |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Appleman
Ты можешь все числовые команды представить в виде стрингов и в консоль выводить наименование команды. Но основная обработка будет происходить с числами. |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
@Appleman, отказываться от битовых масок точно не стоит. Это простой и мощный инструмент, который много где может облегчить тебе жизнь. Для читаемого вывода, как вариант, можно заморочиться и написать утилитарный класс, который через рефлексию (describeType) будет брать имена всех флагов, проверять значение маски на наличие этих самых флагов и составлять готовую строку для вывода.
|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Ну, раз такая пьянка, то я хочу встрять и нагло вставить, что хранить enumы как читаемые строки – это, возможно, оптимальное решение.
1) Сравнить `myValue === MyEnum.ENUM_OPTION_1` – это быстро. Числа сравнить в десятки раз быстрее, но одна наносекунда или 50 – скорее всего, разницы ты не почувствуешь никогда. 2) Иметь возможность вывести читабельный вид без утилитарных классов: 2.1) Банально удобней при отладке – меньше шанс ошибиться – больше времени освободится на оптимизацию частей приложения, которые реально в этом нуждаются 2.2) Исчезает оверхед на создание этого утилитарного класса и его использования – ну, серьёзно, плодить абстракцию там, где она не нужна? и, самое важное, о чём наверняка умалчивают ребята: для поддержания твоего developer happiness оверхед на инфраструктуру будет выше, чем выхлоп. И под оверхед будет вообще всего, в т.ч. и скорости исполнения программы. Сейчас объясню: вряд ли ты будешь делать что-то вроде `myBitMask & bitsIamInterestedIn > 0` в коде каждый раз, когда это будет нужно. Ты сделаешь где-нибудь метод `heyBitMaskIsItOn(myBitMask, bitsIamInterestedIn)`, оттестируешь его и будешь вызывать его всякий раз при работе с битовыми масками. Только вот вызов метода это дороже, чем строковое сравнение (особенно, если строки короткие).
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
@Psycho Tiger, а с комбинациями значений как быть? Заводить еще по строке на каждую такую комбинацию или принимать массив строк? Тут все таки битовые маски, имхо, поудобнее будут. Именно удобнее, ибо о наносекундах, как ты заметил, в таких проектах точно париться не стоит.
И, к слову, о наносекундах: Цитата:
Кстати, вот нашел в закромах небольшой класс, который как раз переводит битовую маску в строку, беря имена флагов из статических констант "enum" класса. Писал давно, надо допиливать, но возможно кому-то пригодится. package { import avmplus.DescribeTypeJSON; import avmplus.INCLUDE_TRAITS; import avmplus.INCLUDE_VARIABLES; import flash.utils.Dictionary; public class BitmaskToString { private static const CACHE:Dictionary = new Dictionary(); public static function fromClass(flagCls:Class, bitmask:int):String { if (CACHE[flagCls] == null) cacheFlags(flagCls); return fromMap(CACHE[flagCls], bitmask); } /* flagMap = { flagName1 : 1, flagName2 : 2, flagName3 : 4, ... } */ [Inline] public static function fromMap(flagMap:Object, bitmask:int):String { var result:String = ''; for (var flagName:String in flagMap) { var flag:int = flagMap[flagName]; if ((bitmask & flag) == flag) { result += flagName + ' | '; } } if (result != '') result = result.substr(0, result.length - 3); return result; } [Inline] private static function cacheFlags(flagCls:Class):void { var clsDescription:Object = DescribeTypeJSON.describeType(flagCls, INCLUDE_TRAITS | INCLUDE_VARIABLES); var constList:Array = clsDescription['traits']['variables']; var flagMap:Object = {}; for (var i:int = 0; i < constList.length; ++i) { if (constList[i].type != 'int') continue; var flagValue:int = flagCls[constList[i].name]; if (flagValue == 0 || (flagValue & (flagValue - 1)) != 0) continue; flagMap[constList[i].name] = flagValue; } CACHE[flagCls] = flagMap; } } } |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
Цитата:
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 11:47. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|