[Закрыть]
 
popoff.donetsk.ua
Тот, кто не знает сомнений - не знает ничего. /Испанская пословица/
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Статьи - Программирование - Модули - a - a.param
Я это делаю
Персональное меню
Голосование
Деньги, либо любимое занятие? Постоянный адрес этого вопроса
Деньги, но неинтересная работа и невозможность уделить время семье
Интересная работа, возможность саморазвиваться, но нищенский заработок
Ваш возраст (не обязательно)
Почему? (не обязательно)

Голосование закрыто.

Поиск по сайту
Реклама
Гинеколог, стоматолог, психотерапевт в Донецке
Статистика

a.param

Постоянный адрес статьи

a.param -- Модуль управления параметрами

Параметры предназначены для того, чтобы администраторы (именно администраторы, а не программист!) могли управлять работой скриптов. Для того, чтобы добавить новую настройку, не нужно изменять базу данных. Не нужно редактировать скрипты редактирования таблицы, а значит не нужно их заново тестировать, а значит не нужно изменять и тесты. А поскольку не меняется база данных, то упрощается и процесс обновления скриптов. При добавлении новой настройки, нужно менять ТОЛЬКО то место, в котором эта настройка используется, никакие другие изменения не требуются.

Немного о том, как возникла идея создания этого модуля
Основные особенности синтаксиса описания и использования параметров
Определить список изменившихся параметров
Наследовать параметры
Проверить синтаксис введенных пользователем параметров
Исходный код модуля a.param
Где сейчас используется технология управления скриптами при помощи параметров

Введение

Постоянный адрес статьи

Когда-то, в далеком теперь уже 2003 году, этого модуля не было. Была идея.

Я писал форум. Писал его с нуля. Какие настройки для тем в нем предусмотреть? Немного поразмыслив, придумались такие настройки, как порядок темы при выводе списка тем, защищенность (для просмотра/добавления требовать привилегию), доступность (разрешить ли добавлять сообщения незарегистрированным пользователям), параметры автоматического удаления сообщений из темы (например, для корзины).

Через некоторое время придумалось добавить список новых сообщений на главной странице. Но показывать сообщения, например, из корзины - не нужно. Добавляем поле в базу данных, пишем скрипт для патча базы данных (чтобы обновить базу данных на других инсталяциях системы), изменяем форму редактирования списка тем, изменяем скрипты записи темы, изменяем юнит-тесты для формы редактирования списка тем и для скриптов записи темы в базу данных.

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

Обратите внимание, мне нужно было добавить всего лишь одну-единственную галочку, а это оказывается почти на полдня работы. Сплошная головная боль, вы не находите?

Но дальше - еще интереснее. Меня попросили написать скрипты для доски объявлений. Изучив немного, как устроена доска объявлений, я пришел к выводу, что доска объявлений и форум - это фактически одно и то же. Отличие, может, только в том, что в доске объявлений на странице со списком топиков показывается первое сообщение топика и количество топиков на странице больше, чем в остальных темах топиков. Писать заново скрипты для доски объявлений, когда доска объявлений - это фактически и есть форум, только с другими настройками? Заказчик, конечно, именно на этом и настаивал, потому что при первом взгляде форум и доска объявлений - это совершенно разные вещи.

Но я решил поразмыслить и придумать, какие настройки можно добавить такие, чтобы в некоторых темах форум оставался форумом, а в некоторых он превращался бы в доску объявлений. В целом из настроек нам нужно только научиться изменять количество тем на странице и дизайн. Количество тем изменить просто - так же, как мы добавляли галочки для разрешения/запрета расширенных смайлов немного выше. А вот с дизайном оказалось все несколько интереснее.

Как первое «лобовое» решение - добавить галочку, которая будет говорить, что в этой теме использовать этот шаблон, а в той - тот шаблон. Это хорошая идея, если заранее известно, что у нас будет только два таких шаблона. А если их будет больше? Можно добавить текстовое поле, в котором вводить имя шаблона. Это уже ближе к истине. А если некоторые шаблоны отличаются незначительно - копировать и в случае изменений редактировать все копии?

Не знаю как Вы, но мне доставляет не слишком много удовольствия процесс механического изменения одного и того же в разных местах. Гораздо больше удовольствия я испытываю, когда, поменяв что-то в одном месте это меняется везде.

Вот здесь и возникла идея, с которой появились параметры. Можно для каждой темы форума задавать строку. В этой строке будут слова, разделенные пробелом. Дальше мы просто задаем вопрос: «есть ли это слово в этой строке?» В зависимости от того, записано ли это слово в этой строке, мы можем менять элементы дизайна, разрешать или запрещать смайлы, показывать или не показывать сообщения на главной странице.

Обратите внимание, как теперь легко все решилось. Для того, чтобы добавить новую галочку, мне теперь не нужно изменять базу данных. Мне не нужно редактировать скрипты управления темами форума, а значит мне не нужно их заново тестировать, а значит не нужно изменять и тесты. А поскольку не меняется база данных, то упрощается и процесс обновления скриптов.

Когда я добавляю новую настройку, мне теперь нужно менять ТОЛЬКО то место, в котором эта настройка используется, никакие другие изменения не требуются. Поле для хранения и скрипты для редактирования строки параметров не меняются от того, какие слова там могут быть - администратор просто зайдет и отредактирует.

Параметры оказались полезными во многих модулях, и копировать один и тот же код в разные модули мне показалось нецелесообразным. Вот так и появился этот модуль.

При использовании параметров в разных модулях к параметрам предъявлялись разные требования. Теперь, когда параметры используются в большом количестве модулей, новые требования уже не появляются. Но теперь параметры не просто «есть или нет», они могут содержать в себе значения (числа, строки и даже списки). Параметры могут наследоваться, для изменения каждого отдельного параметра можно потребовать специальную привилегию.

Основные определения

Постоянный адрес статьи
  • Параметры - это набор пар «имя» - «значение».

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

  • Только администраторы могут изменять параметры. Автоматическое изменение параметров не допускается. Если требуется автоматическое изменение параметров, то их лучше представлять другим способом.

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

  • Обычно параметры не зависят от языка просмотра.

  • Для администраторов набор параметров виден как текстовый список. Имя отделяется от значения символом равенства (=). Элементы списка параметров разделяются пробелом. Например:

    name1=value1 name2=value2

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

  • Если какой-либо параметр присутствует в этом списке, то говорится, что этот параметр определен. Если какой-либо параметр присутствует в этом списке и для него указано значение, то говорится, что этот параметр задан. Между этими двумя словами существует некоторое пересечение (если параметр задан, то, естественно, он определен; если значение отсутствует, то это тоже значение). Поэтому договоримся использовать слово «определен», если мы хотим обратить внимание на имя параметра и слово «задан», если мы хотим обратить внимание на значение параметра.

  • Если для параметра указано значение, то говорится, что значение задано. Если значение не указано, то говорится, что значение не задано.

  • Внутри скриптов параметры представляются ассоциативным массивом, в котором ключ - это имя параметра, а значение - это значение параметра.

  • Список параметров просматривается слева направо. Поэтому если у Вас несколько раз задан один и тот же параметр, то учитываться будет только самый правый (последний) вариант.

  • Если значение параметра не задано, то в списке параметров записывается только имя параметра, без символа равенства. Например:

    name

    Если значение параметра не задано, то в массиве записывается логическое значение true (истина).

    Если записать так:

    name=

    то считается, что значение параметра задано и в массиве появится значение (пустая строка)

  • Если параметр не определен, то в массиве нет соответствующего элемента.

  • Имена параметров организованы иерархически. Слова в именах параметров разделяются точкой (.).

  • Для изменения параметров требуются привилегии. Имена привилегий на управление параметрами включают в себя имена параметров, поэтому имена параметров должны соответствовать требованиям к именам привилегий.

  • Имена параметров чувствительны к регистру.

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

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

    Записывайте в значениях только управляющую информацию.

    Наиболее естественное применение параметров - это задание булевской информации (включено / выключено). В таком случае нас интересует только, определен ли параметр.

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

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

  • Хотя и говорится, что параметры могут изменяться только администраторами, привилегии на управление параметрами могут быть выданы людям, которым нельзя доверять. Система привилегий проверяет только имя параметра, но никак не проверяет его значение. Поэтому скрипты должны себя корректно вести при любом наборе параметров. Обычно для каждого параметра принимается какое-либо значение по умолчанию. Это значение используется в случае, если параметр не задан, либо для этого параметра задано недопустимое значение.

  • Обычно, если заданы параметры с недопустимыми именами (допустимые по синтаксису имени, но эти параметры нигде не используются), либо для каких-то параметров заданы недопустимые значения (снова же, допустимые по синтаксису параметров, но не допустимые с точки зрения тех скриптов, которые эти параметры используют), то это НЕ считается ошибкой. Скрипты должны игнорировать все, что им не понятно.

  • Параметры могут использоваться для управления иерархическими объектами. В таком случае дочерние элементы объекта наследуют параметры родительского элемента.

  • Иерархия может обнаружиться в таких местах, в которых кажется, что ее нет. Например, в неиерархическом форуме (линейный список тем) при управлении темами можно заметить как минимум двухуровневую иерархию: 1) параметры, общие для всех тем форума - задаются в настройках скриптов (базовые параметры); 2) параметры, отдельные для каждой темы форума (параметры тем) - наследуют базовые параметры.

  • При наследовании списки параметров объединяются. При этом если в дочернем объекте определены какие-либо параметры, которые были раньше определены в родительском объекте, то определение этого параметра в родительском объекте игнорируется. Можно говорить, что параметры дочерних объектов имеют более высокий приоритет, чем параметры родительских объектов.

  • При наследовании можно отменить некоторые параметры, которые были определены в родительских объектах. После отмены параметр становится не определенным. Для этого перед именем параметра ставится символ минус (-). Например:

    -name

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

    -name=value

  • Можно отменить не только сам параметр, но и все дочерние параметры. В таком случае становится не определенным как сам параметр, так и все дочерние параметры. Эта операция называется операцией массовой отмены.

    Для массовой отмены перед именем параметра ставится символ «восклицательный знак» (!). Например:

    !name

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

    !name=value

  • При наследовании можно указать, что какой-то параметр действует только в текущем объекте, и не должен наследоваться дочерними объектами. Для этого перед именем параметра ставится тильда (~). Например:

    ~name=value

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

    ~-name1

    или так:

    ~!name2

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

    Символ тильда всегда ставится раньше символа минус и символа восклицательный знак. Это связано с тем, что в первую очередь проверяется, учитывать ли этот параметр при вычислении параметров или этот параметр нужно игнорировать. И только после этого нас интересует, определяется ли параметр или он отменяется. Такая запись не допустима:

    -~name1

  • Можно указать, что для текущего объекта у этого параметра одно значение, а у всех дочерних объектов - другое:

    name=value1 ~name=value2

    Эту запись следует читать так: «параметр равен такому-то значению, но для текущего элемента значение будет такое.»

    Можно указать, что для текущего объекта этот параметр не определен, а для дочерних объектов - определен:

    name=value ~-name

    Эту запись следует читать так: «параметр равен такому-то значению, но для текущего элемента этот параметр не определен.»

    Обратите внимание на порядок следования параметров в списке параметров. Если параметр с тильдой (который определен при некоторых условиях) будет стоять раньше параметра без тильды (который определен всегда), то параметр с тильдой всегда будет игнорироваться. Поэтому параметры с тильдой должны быть всегда правее (ближе к концу списка) соответствующих параметров без тильды.

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

Дополнительная информация

Постоянный адрес статьи

Технология управления скриптами при помощи параметров используется:

Последняя модификация: 03.09.06 21:13

Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>