Стандарты разработки

  • ОБЯЗАТЕЛЬНО! нужно проверять результат совершения операций, которые взаимодействуют с внешней средой, например:
    • Открытие соединения с базой данных;
    • Открытие соединения с NNTP-сервером;
    • Запись файла;
    • Выполнение запроса в БД;
    • Посылка письма
  • Все сервисы должны стартовать автоматически после аварийной перезагрузки сервера.
  • В программный код не зашиваются даты, календари должны работать нормально в високосный год.
  • В коде на бэкендах нельзя использовать хэш %ENV – в нем некорректные значения.
  • Все переменные должны обнуляться перед использованием.
  • Надо проверять относительные урлы на валидность в разных браузерах, часто в листалках, если файл страницы не является DirectoryIndex, например: ../../gallery.html, а ссылка в нем относительная, напр:  , то IE перейдет на ../../gallery.html?param=1, а NN (4.x) перейдет на ../../?param=1, а еще лучше вообще отказаться от относительных урлов.
  • 404-е страницы не должны возвращать 200 статус.
  • Ссылки не должны быть длиннее 200 символов, GET – запрос переданный этим методом имеет ограниченую длину (в старом HTTP)
  • Cсылки на директории сайта должны заканчиваться слэшом – /.
  • Все скрипты, кроме крайней необходимости, разрабатываются в режиме:

use strict;
use warnings;

  • По возможности объявление всех переменных выносится в <%INIT>..., также как и большинство данных для вывода подготавливаются заранее.
    Например, если при отрисовки таблицы используется массив @rows, то этот массив должен быть полностью подготовлен в блоке <%init>, в HTML коде должен быть только цикл for/foreach без каких-бы то ни было дополнительных преобразований элементов массива.
  • При создании сложных конструкций вроде:
  • < a href="<% defined $model_search && $model_search ne '' ? '&model_search='.$model_search : () %>" >

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

Правильно:


% my $link = defined $model_search && $model_search ne '' ? '&model_search='.$model_search : ();
<& /inc/link.msn, link=>$link &>;

  • Путь к компонентам указывается абсолютный, а НЕ относительный.
  • В проектах на Contenido используются только ШЕСТЬ глобальных переменных:
$request в этот хэш заносится все, что имеет отношение к этому конкретному запросу;
$user это текущий пользователь и всего его свойства;
$state состояние проекта. Переменная для настроек;
$project все, что относится к проекту. Это и есть $project_conf – не надо его дублировать!
$keeper объект для связи с базой данных.
$session текущая сессия. Переменная с временем жизни в один запрос;

 

  • Cброс кэшей на странице производится с помощью определенного параметра expire.
    Например, если при запросе страницы http://xxx.rambler.ru/page.html данные берутся из кэша, то при запросе http://xxx.rambler.ru/page.html?expire=1 кэш должен сброситься (пересчитаться заново).
  • Автоматически сгенерированные компоненты и написанные вручную должны быть разнесены.
  • Приветствуется размещение компонент в различных директориях, не только /components/. Как правило есть 2 стандартных директорий для компонентов:
/subs/ здесь размещены компоненты которые занимаются получением, подготовкой и кэшированием данных но которые не выводят HTML
/comps/ компоненты из которых собираются WWW страницы (то есть html+mason c преобладанием html)

 

  • Старайтесь писать понятный структурированный код. Строчки вида

map { очень длинное и сложное выражение } grep { еще одно длинное и сложное выражение } $keeper->get_documents ( 10 фильтров );

сложны для дальнейшей модификации и понимания. Разбивайте их на простые блоки.

  • Старайтесь не выдавать HTML из секции <%INIT> и не вызывать оттуда компонентов выдающих HTML
    (то есть $m->out(...) или $m->comp(...) в init идея плохая).
  • Если в subs создаются компоненты которые работают не только с ядром Contenido а и с какими либо внешними сервисами (внешняя sql-база, почта, внешний www-сервер) это признак того что этот код лучше вынести в отдельный модуль Perl.
  • Необходимо проверять все входные параметры на формат и допустимость значений.
  • Если вы используете пользовательский ввод при отрисовке страницы обязательно обертывать в escape все символы '<' '>' и '&' (иначе легко использовать различного рода < script >, такие фрагменты могут быть даже вредоносными). Это связано с многими вещами, в том числе с используемой нами системой кэширования.
  • Компоненты самого высокого уровня должны иметь расширение .html. Все остальные компоненты, к которым пользователь напрямую ходить не должен должны иметь расширение .msn.
  • Если файл не является компонентой Mason и не доступен пользователю для прямого скачивания, то его не должно быть в директориях /comps/*. Для прегенеренных данных используйте директорию данных – $state->{data_dir} или /i/.
  • Не делайте больших компонент.
  • Минимизируйте использование процедур внутри компонентов (из-за сложностей с компиляцией и обработкой их Mason’ом);
  • Если запрашивается несуществующий или некорректный документ, то используйте функцию abort404();
  • Мы не используем copy/paste в программировании.
  • Если работаете в файлами на основе пользовательских данных (будь то query или cookie или еще что вполть до referer/user agent) то будьте очень аккуратны (необходимо чистить данные от '/' '.' '\' '*').
  • Старайтесь получать от keeper только те документы, которые вам нужны. Не стоит получать половину базы и потом перебором отбирать нужные вам.
  • Cтарайтесь не делать большие по размеру компоненты высокого уровня к которым обращается клиент. В них же ОБЯЗАТЕЛЬНО в <%ARGS> описывайте ВСЕ принимаемые параметры.
  • Если используется много статичного JavaScript — вынесите его в отдельный файл и положите там, где он не будет обрабатываться Mason'ом.
  • Мы не прописываем в компонентах прямые пути к файлам и директориям. Всегда и везде пляшите от переменных, хранящихся в $state (их достаточно для удовлетворения любых нужд).


Смотрите также:

  • perldoc perlstyle
  • Фаулер М. и другие. Рефакторинг: улучшение существующего кода
Организация запросов к БД
Начальная структура данных проекта
Объектная модель данных. Интеграция таблиц в Contenido
Стандарты разработки
Стандарты оформления