#actionscript-3 #oop
#actionscript-3 #ооп
Вопрос:
Я создал класс, который использую в качестве хранилища для всех списков в своих приложениях. Класс позволяет мне «подписывать» объект в список (который может быть создан «на лету» с помощью sign()
метода, подобного этому):
manager.sign(myObject, "someList");
При этом сохраняется индекс элемента (с использованием его уникального идентификатора) во вновь созданном или ранее созданном списке «someList», а также объект в 2D-массиве. Так, например, я мог бы в конечном итоге получить это:
trace(_indexes["someList"][objectId]); // 0 - the object is the first in this list
trace(_instances["someList"]); // [object MyObject]
У класса есть еще два метода:
-
find(signature:String):Array
Этот метод возвращает массив черезslice()
, содержащий все элементы, подписанные заданной подписью. -
findFirst(signature:String):Object
Этот метод просто возвращает первый объект в заданном списке
Итак, чтобы получить MyObject, я могу либо перейти:
trace(find("someList")[0]);
or
trace(findFirst("someList"));
Наконец, есть unsign()
функция, которая удалит объект из заданного списка. Эта функция в основном:
- Сохраняет результат
pop()
в указанном списке в переменной. - Использует сохраненный индекс для быстрой замены указанного объекта
pop()
‘d элементом. - Удаляет сохраненный индекс для указанного объекта и обновляет индекс для
pop()
‘d элемента.
Благодаря всему этому использование unsign()
чрезвычайно быстро удалит объект из списка любого размера.
Теперь это все хорошо, но у меня появились некоторые мысли, которые заставляют меня задуматься, насколько это хорошо на самом деле? Я имею в виду, что возможность легко составлять списки всего, что мне нужно, удалять их и получать к ним доступ по всему приложению, вот так, потрясающе, но есть ли в этом подвох?
У меня возникла пара начальных мыслей:
- До сих пор я не реализовал поддержку списков, которые являются частными и доступны только через данный класс.
- Память — кажется, это не очень эффективно для памяти. С другой стороны, также не создается массивов для всего, что я хочу хранить по отдельности. Просто кажется.. Больше.. Каким-то образом.
Есть идеи?
Я загрузил класс здесь на случай, если вышесказанное не имеет особого смысла: https://projectavian.com/AviManager.as
Комментарии:
1. похоже, вы перегружаете его.
Ответ №1:
Ваше решение кажется довольно надежным. Если вы хотите сделать его немного более расширяемым и управлять правами, вы могли бы рассмотреть возможность переноса всех этих индивидуально проиндексированных свойств в объект value для ваших AV-элементов. Вы могли бы выполнить такие операции, как «подписать» и «отменить подпись» внутри VOs, или проверить права доступа. Ваш класс управления мог бы отслеживать коллекцию этих VO, передавать их по кругу, выполнять вызовы методов, и объекты сохраняли бы состояние в немного более удобочитаемом формате.
На самом деле, однако, это вступает в обсуждение стиля кодирования. Ваш метод работает, и он не особенно неэффективен. Просто убедитесь, что код читаем, инкапсулирован и расширяем, и все будет в порядке.
Комментарии:
1. На самом деле это интересное решение. В приложении созданы отдельные экземпляры, которые обрабатывают sign, unsign и т.д. И действуют как посредник между подписанным объектом и core manager. Это означает, что я мог бы также указать, будет ли созданный список доступен только внутри созданного им класса или глобально.