Программизмы
Только что друг показал мне одну интересную страницу.
На ней расположен архив самых ужасных кусков кода,которые только может выдать человеческий мозг. Осмыслить и понять эти куски человеческий мозг уже способен с большим трудом. Код написан на C++ и в нём сможет разобраться каждый, даже без уморительных английских вставок автора архива, поэтому я не возьмусь переводить статью на русский. Интересно другое.
Я вылез в Гугл и нашёл реального автора одной из программ. Я даю ссылку на ветку одного форума… Угадайте, на каком языке написана программа? На Java.
Читать рекомендую тред целиком,на второй странице выложены не меньшие перлы. Люди, не начинайте знакомство с программированием с лёгких языков вроде Бейсика, Явы и PHP\Perl! Они слишком легки, чтобы программист вообще задумывался над своей программой.
Рассуждение одного из героев треда:
"Если (a>b) ложно,то логически следует, что b должно быть больше а. <..>"
Классно. Просто замечательно. От автора ускользнула мелкая деталь: a=b. Я не придираюсь, просто пытаюсь найти ту последовательность мыслей, тот корень в логике, провал мозга, который породил столь интересное творение:
if(a > b && b > c) {
// a is greatest
} else if(b > c) {
// note there is no b>a
// b is greatest
} else {
// note there is no test at all
// c is greatest
}
Заметьте - это функция выбора наибольшего элемента. Для трёх элементов. А теперь представьте,что элементов 5, 7, 10, 100…
Ему не жалко стирать пальцы.
Есть три вида ошибок. Первый - это обычные опечатки, вроде следующей для Си:
Такое случается спросонья,и никто от этого не застрахован. К тому же, компилятор в большинстве случаев вас спасёт.if ($value = $some_value) { … }
Второй вид - это непродуманность, вроде хранения числа -333
в типе unsigned char
или написания цикла if (password==’password’).
Это лечится с опытом, хотя может и обрушить\помешать работе пары систем.
Наконец,третий вид - это именно такие программизмы. Перлы индийского кода. Те творения, авторов которых назвать “быдлокодерами” даже сложно.
Я сам писал нечто подобное лишь раз: это моя функция смены регистра с верхнего на нижний или наоборот; она кочует по моим прогам по одной хорошей причине: я сижу на разных компьютерах и компилю проги на разных системах. Дома у меня стоит Linux, в универе - Винда. Кодировки русского на обеих системах разные, это может быть KOI8-R, CP1251, UTF-8 или (о ужас, кто такое придумал в нашем универе) ISO 8859-5. Как следствие, обычный сдвиг ASCII\UTF значения попросту не работает, когда я конвертирую код в другую кодировку. Именно так в моих программах можно встретить:
char tolower(const char input){
switch (input){
case (‘А’): return (‘а’);break;//надо же с чего-нибудь начинать
case ‘Й’: return (‘й’);break;//йцукенг удобнее абв
case ‘Ё’: return (‘ё’);break;//не забудем родную буковку
case ‘Ц’: return (‘ц’);break;//дети учат эту буковку первой.Кто сказал “А”? Вы всегда читает книгу с начала?
case ‘У’: return (‘у’);break;//Ни один порядочный ребёнок не будет читать книгу с начала
case ‘К’: return (‘к’);break;//Вместо этого он будет смотреть картинки
case ‘Е’: return (‘е’);break;//Причём все и без порядка
case ‘Н’: return (‘н’);break;//От У до Г
case ‘Г’: return (‘г’);break;//а потом обратно
case ‘Ш’: return (‘ш’);break;//от Ш до Г
case ‘Щ’: return (‘щ’);break;//да,он посмотрит Г два раза
case ‘З’: return (‘з’);break;//надо с детских лет приучать ребёнка уделять большое внимание всякой гадости
case ‘Х’: return (‘х’);break;//потому что он потом всю жизнь только этим и будет заниматься
case ‘Ъ’: return (‘ъ’);break;//так,сейчас у нас твёрдый знак
case ‘Ф’: return (‘ф’);break;//на Олимпийских играх в китае он получил медаль за твёрдость
case ‘Ы’: return (‘ы’);break;//Что не значит,что эта медаль была российской
case ‘В’: return (‘в’);break;
case ‘П’: return (‘п’);break;//помните,мы с чего-то начинали?
case ‘Р’: return (‘р’);break;//наверняка помните
case ‘О’: return (‘о’);break;//это - О.Познакомьтесь.Очень приятно.
case ‘Л’: return (‘л’);break;//здесь слишком много комментов
case ‘Д’: return (‘д’);break;//ненавижу комменты
case ‘Ж’: return (‘ж’);break;//люблю комменты
case ‘Э’: return (‘э’);break;//один из комментов лжёт
case ‘Я’: return (‘я’);break;//любимая буковка
case ‘Ч’: return (‘ч’);break;//два коммента лгут
case ‘С’: return (‘с’);break;//здесь вообще сборище борцов за правду
case ‘М’: return (‘м’);break;//думайте над этой логической задачей
case ‘И’: return (‘и’);break;//в этих комментах нет смысла..давайте закончим
case ‘Т’: return (‘т’);break;//держись,Саня,ещё немного и мы закончим эту муть…
case ‘Ь’: return (‘ь’);break;//ну ещё чуть-чуть…
case ‘Б’: return (‘б’);break;//ещё немного…
case ‘Ю’: return (‘ю’);break;//ДА!!!Закончили.
}
return input;
}
Люди,если вы тратите на подобное 100 килобайт - у вас должна быть причина. Если вы тратите 500 килобайт - весомая причина. Наконец, у вас должна быть просто КЛЯТВЕННАЯ УВЕРЕННОСТЬ в том,что вы знаете,что делаете, если вы тратите на это два мегабайта.
Напоследок, немного ещё интересных строчек.
public string GetUsername (string userName)
{
User user = DbLookup.GetUser(userName);
return user.Username;
}
Есть лишь два логичных объяснения такому: либо прогрев базы данных, либо надо выяснить, существует ли такой юзер. В любом случае, решения этих проблем занимают в 4 раза меньше строк.
string @string = @”new @string()”.ToString();
@string = @string == @”string” ? @string : @”Hello World!”;
Я не могу понять до конца глубину этих двух строк. Возможно,в них есть какой-то тайный смысл. В любом случае, если автор хотел просто потренироваться в эзотеричности, опробовать новый финт ушами или хотя бы просто проверить компилятор - он выполнил это самым остроумным способом.
if 1 <> 1 then
// <..>
end if
Классический пример творчества наших братьев по разуму. Действительно,а вдруг? Это даже круче следующего.
if (someVariable == someVariable) {
// <..>
}
Это уже просто образец паранойи. Есть только одно логическое объяснение подобному: someVariable=NULL, так что такой код может иметь под собой какую-то почву. Но опять же, зачем городить эзотерику?
Чувствую,что я немного сбавляю темп, это всё равно что представлять публике сакраментальное #define NUMBER_1 1
. Что же,исправлюсь. Проверка булевой переменной:
if (boolean.toString().length()<5){…}
if (value && System.Convert.ToBoolean(“false”)){…} else{…}
if (b.toString.substring(0, 1).equals(“t”)) {…}
Небольшая вариация:
if (b.ToString().ToLower()[0].Equals(Convert.ToChar(“t”))){…}
Окончание парада - вычисление 1% от числа:
a=abs(b-(b*1.01));
Ей-богу,когда у меня что-то глючит, тормозит или просто плохо работает,я вспоминаю о таких перлах…