У меня на сайте действует форум на движке PHPBB. Так случилось, что мне довелось писать мод для этого форума (изменять код форума) и я попал в ситуацию, когда программист сталкивается с чужим кодом. Позвольте мне немного побрюзжать. Я очень уважаю людей, которые пишут такие замечательные вещи и все же, все же... Пусть это будет только моей точкой зрения, но в идеальном мире код PHPBB был бы гораздо проще и понятнее. Сейчас он очень запутан, несмотря на то, что исходный код доступен и можно было бы постараться сделать его гораздо более читаемым, модифицируемым, структурированным и функциональным.

Функциональность

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

Было бы логично иметь функцию delete_post(post_id), которая бы удаляла сообщение по его идентификатору post_id. Взамен этого у нас имеется функция delete_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id). Вы оценили количество параметров? И все они обязательны! Да, в целях быстродействия можно было бы написать функцию, которой можно было бы передавть не только идентификатор сообщения, но и номер темы и форума, но ведь можно сделать их необязательными параметрами и если они не заданы, брать их из базы данных. Да, достаточно печально. Функция delete_post привязана к контексту и мне проще было повторить ее функционал в своей функции, чем собирать эти параметры. Проще и по времени и по размеру кода. :)

Наглядность и комментарии

О комментариях можно сказать только одно - они имеются. Второе - их мало. И третье - их катастрофически не хватает. Подозреваю, что это сделано для увеличения производительности. Очевидно, комментарии сильно тормозят выполнение кода (php не грузится к пользователю, поэтому очевидно, комментарии сильно тормозят работу именно сервера) :)

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

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

Сессии

Схема сессий во всех системах более-менее стандартна. PHPBB, как и прочие системы типа PHP-NUKE, не использует простые в кодировании возможности PHP4 по ведению сессий. Вместо этого (наверное для совместимости с PHP3) используется хранение параметров сессии в базе данных.

Способ безусловно, надежный и быстрый, но возникает проблема в передаче параметров от страницы к странице. Если в PHP4 параметры можно передавать в обычных PHP-переменных с любым (даже заранее неизвестным именем), то здесь никаких дополнительных значений передать не получится и приходится или добавлять в колонку таблицы сессии или же мучительно сложно передавать их от страницы к странице через переменные формы методом POST - создавать невидимые поля, устанавливать в них значения. Причем эти значения доступны для изменения через java-script любому взломщику.

Можно было бы завести вспомогательную таблицу типа (session_id, variable, value) и две функции для установки и чтения переменных сессии, хранящихся в этой таблице в колонке value в виде строк, если уж не хочется использовать более прозрачный в этих вопросах PHP4. Но настоящие кодеры не ищут простых путей!

Объектно-ориентированное программирование

PHP 4 поддерживает объектно ориентированное программирование. В PHPBB его пока нет. А ведь было бы очень наглядно.
Можно было бы забыть про существование HTML, страниц и т.п.
Были бы объекты:

  • Форум - отвечал бы за функционирование всего форума
  • Сообщение - сообщение в форуме, методы: добавить, удалить, изменить
  • Тема - тема в форуме
  • Пользователь - пользователь форума
  • Сессия - текущая сессия
  • Страница отправки сообщения
  • Страница удаления сообщения
  • Страница просмотра форума
  • Базовая страница форума - от нее наследуют все другие страницы
  • Объекты можно было бы передавать между сессиями. Код стал бы более прозрачным. Очевидно - за этим будущее.

    Заключение

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

    Здесь приведена лишь малая толика замечаний. Возможно я напишу свой форум, а может быть PHPBB изменится в лучшую сторону, посмотрим.