Что такое говнокод
Уверен вы уже слышали этот термин и не раз, ниже на реальных примерах я расскажу как обстоят дела и почему все так плохо. Берите лопаты и надевайте галоши — сейчас будем копать.
Думаю очевидно что я не могу показывать примеры кода из моих реальных проектов, чтобы не подгорели жопы не словить проблем с владельцами. Поэтому все примеры ниже взяты из интернета.
Тем не менее, каждый пример говнокода ниже встречается в живых проектах на регулярной основе. А некоторые проекты из одного только говнокода и состоят. Поехали.
Пример первый: Кто понял жизнь тот не спешит
Начнем с нетленного:
void get_tomorrow_date( struct timeval *date ) { sleep( 86400 ); // 60 * 60 * 24 gettimeofday( date, 0 ); }
Смысл функции — получить завтрашнюю дату от указанной. Реализовано это в виде паузы длиной в день: программа засыпает на день и затем отдается текущая дата.
Казалось бы выдуманный и детский пример — ну кто будет ждать целый день? Ведь пользователь заметит такое.
Все бы так и было, но на свете есть фоновая обработка и планировщики, где такое встречается повсеместно.
Возможно даже ваш очень важный отчет, составляемый раз в день генерируется таким кодом.
Пример второй: Эталонная безопасность
Какие хеши, пароли и безопасность? Кому это надо когда есть банальное и работающее:
if(e.password == '23f9dg'){ $('#editable').show(0); }
Да, это проверка авторизации с помощью зашитого в код пароля.
Пикантности прибавляет то что это Javascript и весь код виден в браузере.
Такой говнокод — частый гость во всяких доморощенных модулях для WordPress, самопальных CMS и блог-движках на PHP.
Ну и в прошивках WiFi-роутеров, где есть веб-интерфейс. Но у вас конечно же такого нет, я надеюсь.
Пример третий: Все взять и посчитать
Компьютеры стали быстрые, а сети без задержек — самое время для лепки вставки говнокода:
// сколько сегодня зарегестрировалось по приглашению public function getTodayCount() { $query = self::select("select * from invites where date='" . date("Y.m.d") . "'"); return count($query); }
Функция отдает в виде числа количество приглашений на сегодняшнюю дату. Вместо того чтобы запросить из базы одно лишь число, используя синтаксис SQL вроде select count(*) и дать базе самой подсчитать свои записи, происходит выкачивание всех записей из базы и их подсчет. В памяти приложения разумеется.
На любом языке, на любых фреймворках в каждом втором приложении созданном аутсорсерами обязательно будет логика «выкачай все и посчитай».
В чем тут проблема?
Ну например записей может быть миллион или даже два. Очевидно что на таких объемах все сломается.
Еще это большая нагрузка на базу данных, сеть и всю цепочку обработки данных:
выборку с данными надо сформировать, передать и распарсить — соответственно.
Вообщем, хорошего тут ничего нет.
Пример четвертый: Импортозамещение
Несколько однотипных примеров для понимания масштаба:
function confirmDialog(sMessage) { if (confirm(sMessage)) { return true; } else { return false; } } .. function print(){ window.print() ; } .. function document_write($text) { document.write($text); return false; } .. function nik_slashes(&$value) { return (stripslashes($value)); }
Берем системную функцию, оборачиваем в свою, вызываем. Называем «собственной разработкой».
Ну например чтобы раздуть объем кода проекта: представьте что всего блока выше можно было и не делать — приложение работало бы и без него.
Справедливости ради, такое часто встречается как результат неубранной отладки — ставить точку останова в отладчике умеют не все, поэтому куда чаще встречается оборачивание плюс логирование вызовов.
Но объем такого говнокода может быть очень большим — месить делать его просто, а результат визуально выглядит серьезно. Поэтому и лепят.
Итого
Абсолютно ничего хорошего в говнокоде нет.
Его наличие в вашем проекте — однозначный показатель очень плохих внутренних процессов: нехватки времени, компетенций или наплевательского отношения к своей работе.
А значит очень скоро ваш проект развалится, будучи похороненным под этими каловыми массами. Поэтому чем раньше вы возьметесь за голову и займетесь чисткой — тем больше шансов не потонуть.