Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объекты JavaScript и рациональность их использования. (https://javascript.ru/forum/misc/11723-obekty-javascript-i-racionalnost-ikh-ispolzovaniya.html)

KBEPT 09.09.2010 20:52

Объекты JavaScript и рациональность их использования.
 
Всем здравствуйте.

У меня вопрос по поводу рациональности использования своих объектов в скриптах.

Вступление
По некоторым соображениям мне необходимо в процессе выполнения некоторых функций JavaScript, знать и передавать текущие состояния кнопок на форме.
Думал и обдумывал, стараясь "избавиться" от такого хранения состояний кнопок и пришел к решению, что это в моем случае неизбежно.

Объясню теперь подробно
На некоторых страницах сайта, будет расположено немалое количество кнопок, по некоторым подсчетам от 52 до 56, в зависимости от некоторых заранее-известных данных.
Мне необходимо о каждой из этих кнопок хранить данные - нажата или не нажата кнопка.
То есть получается что должно быть 52 или 56 переменных типа Boolean.
Естественно создавать руками 56 переменных, это мягко-говоря - нерационально.
При нажатии на любую из этих 56 кнопок, нужно обязательно знать текущее состояние определенной одной кнопки из остальных 55 кнопок на странице.
Я собираюсь хранить информацию в виде мини-таблицы, то есть как Record(запись) и она будет иметь вид:
-------------------------
| ID Кнопки | Состояние |
-------------------------

Я решил создать собственный объект и хранить данные там.

...
  my_object = new Object();
  my_object["button_0"] = true;
  my_object["button_0"] = false;
  my_object["button_0"] = true;
  my_object["button_0"] = true;
  ...
  my_object["button_56"] = false;
...

Сами свойства объекта я заполняю циклом один раз, сразу после загрузки страницы. Здесь я показал заполнение "вручную" для наглядности.

Доступ к состоянию любой из кнопки естественно очень прост:
...
var need_button = "button_33";
alert( my_object[need_button] );
...

Вопрос
Рационален ли такой подход к моей проблеме или есть другие, более оперативные способы решения моей проблемы ?

Заранее благодарю за ответ(ы) :)

inGray 09.09.2010 21:18

Недавно проскакивала тема, в которой обсуждалась возможность использования числового типа, как хранилища нескольких булевых значений..

KBEPT 09.09.2010 21:40

Да, я примерно представляю о чем Вы говорите.
Я раньше в большинстве случаев, да и сейчас частенько в некоторых вариантах использую подобный подход:

Описание подхода
Предположим, нужно хранить 8 значений типа boolean.
Их можно уместить в байте данных.
И в зависимости от значений этих 8 переменных, наше итоговое "контейнерное" байт-число будет принимать значение от 0 до 255 соответственно.
То есть алгоритм очень прост:
Как всем известно, Boolean - принимает значение true или false -> 1 или 0
Предстваляем значения всех 8 переменных в виде едениц и нулей:
01101110
То есть (слева-направо):
1 переменная имеет значение false
2 переменная имеет значение true
3 переменная имеет значение true
...
8 переменная имеет значение false
Затем полученное число преобразуется из двоичного представления в десятичное и мы получаем число.

Способ неплох, но только не в данном случае.
Представляете как муторно получить будет значение состояния кнопки "button_27" например в моем случае ?

Именно по-этому я и "связался" с объектами ... :)

B@rmaley.e><e 09.09.2010 21:43

KBEPT, в JS числа четырехбайтовые, поэтому можно хранить 32 переменные.
Ну и ничто не мешает Вам написать класс-прослойку, предоставляющую удобный интерфейс для хранения bool'ов в number'ах.

Gvozd 09.09.2010 21:57

Цитата:

Сообщение от B@rmaley.e><e
в JS числа четырехбайтовые

ложь и провокация
данный код не дает переполнения(возможно зависит от браузера):
alert(256*256*256*256+1)
alert(256*256*256*256+2)
alert(256*256*256*256+3)

Цитата:

Сообщение от B@rmaley.e><e
поэтому можно хранить 32 переменные.

а вот это уже правда во всех барузерах
var base=256*256*256*256;
var a=base*255+1;
var b=base    +1;
alert([a,b])
alert([a==b,~~a==~~b]);

как видим при применении битовых операций число урезается до 32 битов

а, вообще, использование единого числа для хранения булевых чисел работает гораздо медленнее чем использование объекта.

KBEPT 09.09.2010 21:58

Нет, я понимаю все моменты с типами данных JavaScript :)
Мы отклонились в нашей дискуссии от основной вопросо-проблемы ...

В данном и конкретном случае, когда необходимо получать значение состояния кнопки по ее ID, реализация данного действия через свойства объекта рациональна ?

В данном случае я не буду писать допольнительных функций и классов для изъятия состояния кнопки по ее ID, а просто считаю значение нужного свойства объекта и все.

KBEPT 09.09.2010 22:04

Цитата:

Сообщение от Gvozd (Сообщение 70296)
а, вообще, использование единого числа для хранения булевых чисел работает гораздо медленнее чем использование объекта.

Вот и я так думаю, тем более в случае, когда нужно получать значение состояния кнопки по ее ID.
И процесс получения значения состояния сводится всего к одной строчке:
...
var value_of_status = my_object["button_17"];
...

И никаких дополнительных функций с использованием условных операторов и операторов цикла :)

Kolyaj 10.09.2010 00:22

Цитата:

Сообщение от KBEPT
В данном и конкретном случае, когда необходимо получать значение состояния кнопки по ее ID, реализация данного действия через свойства объекта рациональна ?

Блин, да какая разница? Этот вопрос не стоит всех тех букв, что вы про него написали.

KBEPT 10.09.2010 00:40

Спасибо, я уже разобрался с этим вопросом :)
Остановился на объектах :)

И еще один момент.
Я всегда основные моменты выделяю, как например вопрос в данной теме. Я просто спрашивал рационально или нет ...
Есть такой анекдот (или не анекдот) короткий:

Выходит монах из монастыря, подбегает к забору и хочет перепрыгнуть в час ночной.
Его останавливает батюшка и спрашивает:
- Кто? Куда? Зачем?
На что монах ему отвечает:
- Иван. В магазин. За водкой.

Это я все к чему...
К тому, что можно было просто дать ответ (если конечно знаете) - рационально и пойдет или нерационально.

Спасибо еще раз :)

Gozar 10.09.2010 06:52

KBEPT,
на сайте много литературы, которая дает ответы на такие вопросы, просто большинство лениться её читать, а всем наскучило их повторять или давать похожие.

Так вот басня:

Сидит обезьяна и меряет какие очки лучше. Вопрос зачем обезьяне очки и что курил Крылов?
Это я все к чему, да круто же, я басню рассказал. :)

http://javascript.ru/ui/show-hide-toggle и т.д.


Часовой пояс GMT +3, время: 15:31.