Кодеру: JavaScript (#1)

Для тех кто в танке!!!!!

 

 

Если Вы не программист то вам не стоит читать статью дальше.
Если вы программист, но не знаете JavaScript и не хотите знать, то вам также не стоит читать эту стать

 

 

Статья #1 из цикла "Кодеру".
Тут я буду размещать некоторые тонкости с которыми мне пришлось столкнуться при написание скриптов.

Данная статья описывает то, как я когда-то столкнулся с проверкой наличия разных флагов которые мне приходилось использовать в своих скриптах.

И так начнем.

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

Как было:

var obj = {};
obj.id = 1;
obj.selected = false;
obj.checked = false;

Используя эти свойства объекта мне приходилось строить целые цепочки проверок для передачи данных как параметры к AJAX запросу, да и вообще для функци в часности. В данном примере конечно свойств мало, однако я работал с большим количеством.

Однако, когда мне в голову пришла идея минимизировать проверки разного рода и создать флаг-свойств, чтобы не создавать дополнительные свойства объекта.

var SELECTED = 0x1<<1;
var
CHECKED =  0x1<<2;

var
obj = {};
obj.id = 1;
obj.flags = false;

Теперь собственно для чего все это. Допустим у нас есть некоторая функция которая выявляет свойства объекта:
Схема без флагов

 function check(obj, type) {
      if (type == 'selected') { 
            return obj.selected;
       }
      if (type == 'checked') { 
            return obj.checked;
       }
}

Немного грамоздко не так ли?
А теперь рассмотрим как бы это могло бы выглядеть с флагами:

 function check(obj, flag) {
     return !!(obj.flags & flag);
}

Таким образом используя флаги мы сократили функцию check(...) до минимума. Даже если мы добавим другие флаги наша функция будет работать для всех флагов.

Ну теперь посмотрим наглядно на примере:
Без флагов.

 

var obj = {};
obj.id = 1;
obj.selected = false;
obj.checked = false;

 function check(obj, type) {
      if (type == 'selected') { 
            return obj.selected;
       }
      if (type == 'checked') { 
            return obj.checked;
       }
}

obj.selected = true;
obj.checked = true;
var ret_selected = check(obj, 'selected');
var ret_checked = check(obj, 'checked');

Этот код показывает, что чтобы определить установленно ли свойство selected или нет.

Теперь рассмотри пример реализации через флаги.

var SELECTED = 0x1<<1;
var
CHECKED = 0x1<<2;
var
obj = {};
obj.id = 1;
obj.flags = false;

function check(obj, flag) {
     return !!(obj.flags & flag);
}

obj.flags = SELECTED | CHECKED ;
var ret_selected = check(obj,SELECTED);
var ret_checked = check(obj,CHECKED);

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

Немного о !!(obj.flags & flag);
обыкновенное выражение (obj.flags & flag) даст результат  null или flag. Чтобы перевести это в булевый тип достаточно *** логический оператор отрицания !(obj.flags & flag) но к обратному, так-как это всетаки отрицание. Чтобы обратить наше отрицание, достаточно подставить еще одно !!(obj.flags & flag).

Вот собственно и всё.
Переодически буду публиковать всякие идеи и мысли.




    Все записи (20) | Профиль пользователя |
    Пройдя регистрацию, вы можете оценить данную запись
       
    Оценка записи : 0
    Просмотров записи : 2044
    Категория:
    Аниме дневник | Блог

    Дата написания: 2007-11-16 | 02:44 pm | ©



    Комментарии к записи
    Зарегистрированные пользователи могут оставить комментарии здесь
    kasim
    avatar

    11-16-2007 | 03:18 pm
    Комментарий: [ kasim | Дневник kasim | Написать сообщение для kasim ]


    спасибо!!!








    Реклама на сайте | Конфиденциальность | Контакты