Меню показать Меню скрыть
Современные
проекты
от ПаЛыЧа
Белокопытов Константин Белокопытов Константин
4 г. назад

«Быдлокод» или же простая лень и невнимательность разработчиков расширений

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

Итак, самое простое и безнадежное.

Синтаксис языка PHP и HTML.

Всем известно, что возможно написание тега <? так и <?php. Ну неужели так сложно писать полный синтаксис!? Да, все сервера поддерживают и полный и сокращенный вид тега, но полный синтаксис все же корректнее.

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

Далее, все знают, что для ввода данных используется форма с полями ввода данных, таких как <input>, <textarea>. И каждое такое поле имеет описание, т.е. что пользователь должен ввести, например «Ваше имя». По стандарту для каждого такого элемента должен быть представлен тег <label>, в котором и заключен текст описания поля ввода. Так почему бы его и не использовать!? Нет, вместо этого умудряются использовать к примеру тег <span> или вообще без каких либо тегов для обрамления описания. Т.е. вот так:

<td>Введите ваше имя: <input></td>

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

О Joomla любимой

Это были общие замечания по программированию. Теперь обратимся к мною любимой Joomla.

После появления версий Joomla 1.6 и выше отказаться от ветки 1.5.х пока не представляется возможным. Причины разные:

  1. Сайт достаточно большой и перенос на новую версию трудоемок.
  2. Сайт связан с внешними сторонними разработками.
  3. На сайте установлены уникальные расширения, разработанные исключительно под данную тематику.

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

Вот, например, глобальная переменная $mainframe, почему бы сразу не использовать $app =& JFactory::getApplication(). Все то же самое, только адаптировать потом уникальное расширение от 1.5 под старшие ветки проще.

В модели есть переменная $_db. Зачем в функциях модели создавать лишнюю переменную $db =& JFactory::getDBO(), если можно обратиться к имеющейся переменной $thi->_db.

Теперь немного о платных расширениях.

Для сайта на основе Joomla 1.5 нужен был календарь событий. По функционалу более близким оказался «Eventix». Компонент оказался платным, его стоимость $29.90. Данное расширение было официально куплено, установлено на сайт и началась его модификация под задачу.

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

Итак, досадные «ляпы» разработчиков компонента «Eventix».

Практически все формы редактирование (добавления) категорий, событий, скопированы под кальку. Т.е. одни и те же ошибки. В шаблонах теги <label> относятся к какому угодно элементу, только не к тем, что нужно.

Такое ощущение, что данный компонент писал человек, который «знает» API Joomla, но при этом использовать его не собирается.

Вот таким образом выводится список категорий при создании события:

<td>
         <select name="categorie_event" id="categorie_event">
         <option value=""><?php echo JText::_( 'SELECT_CATEGORY' ); ?></option>
<?php
         for ($i=0, $n=count( $this->categories ); $i < $n; $i++)
         {
                   $categorie = &$this->categories[$i];
                   $select_categorie='';
                   if($this->event->categorie_event==$categorie->id_categorie){ $select_categorie= ' selected="selected"'; }
                   echo '<option value="'.$categorie->id_categorie.'" '.$select_categorie.'>'.$categorie->name_categorie.'</option>';    
         }
?>
         </select>
</td>

Это что-то с чем-то!

Вот правильное и более простое решение:

<td>
<?php
         echo $list['categorie'];
?>
</td>

А во вьювере view.html.php пишем следующее:

$query = 'SELECT id_categorie as id, name_categorie as title FROM #__eventix_categorie WHERE published=1 ORDER BY order_categorie ASC';
$db->setQuery($query);
$categorielist = array();
$categorielist[]   = JHTML::_('select.option',  '0', JText::_( 'SELECT_TYPE' ), 'id', 'title' );
$categorielist     = array_merge( $categorielist, $db->loadObjectList() );
$lists['categorie']         = JHTML::_('select.genericlist',   $categorielist, 'categorie_event', 'class="inputbox" size="1"','id', 'title', $event->categorie_event );
$this->assignRef('lists', $lists);

Сразу скажу, что это часть кода! Но ведь она намного легче читается и организована более правильно с точки зрения структуры MVC.

Далее, смотрим что в коде контроллера, например controllers/event.php, функция save().

function save()
{
         $model = $this->getModel('event');
         if ($model->store($post)) {
                   $msg = JText::_( 'Event Saved!' );
         } else {
                   $msg = JText::_( 'Error Saving Event' );
         }
// Check the table in so it can be edited.... we are done with it anyway
         $link = 'index.php?option=com_eventix';
>         $this->setRedirect($link, $msg);
}

Что мы видим? Есть переменная $post, которая каким-то волшебным методом должна содержать данные о данных, переданных из формы ввода. Да, данные передаются, API Joomla позаботилась о дураках-разработчиках. Но почему бы не написать правильно код?

Просто добавить: $post = JRequest::get('post');

Спрашивается, за что платить деньги разработчику, если он пишет такой неаккуратный код!?

И ведь в большинстве расширений встречаются такие «ляпы». А результат этих «ляпов» может сказаться на корректности работы расширения, а также забивает error.log совершенно ненужными сообщениями.

Немного о неудобстве функционала данного календаря событий Eventix.

Каждое событие имеет организатора, что помешало создать форму добавления/редактирования организатора событий, чтобы каждый раз не вносить одни и те же данные!?

Карта построена на основе Google Maps. Аналогично, почему бы не создать заранее список стран, их же чуть меньше 260. Также при добавлении города, адреса, карта остается на том приближении, что указано в параметрах компонента. Очень неудобно.

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

Комментарии

#DeusMouds13.09.2012 16:47
// Всем известно, что возможно написание тега php echo $var выглядят по ублюдски, против =$var. Вообще, с приходом php 5 от лонгтегов повсеместно отказываются - избыточно.

// Ну, неужели так трудно придерживаться правильного стиля в написании кода.
Если есть среда разработки, код форматируется автоматически в выбранном стилевом формате. Моя IDE, например, настроена на PSR2 стандарт.

//В модели есть переменная $_db. Зачем в функциях модели создавать лишнюю переменную $db =& JFactory::getDBO(), если можно обратиться к имеющейся переменной $thi->_db.
Это противоречит одному из трех основных принципов ООП - инкапсуляции. Скорее всего в контексте фабрики $_db вообще является private/protected членом, который верно изолировали.

PS: Я хз что такое eventix XD Ответить

Добавить комментарий

Наверх