Pull to refresh

Comments 30

XDebug? Нет, не слышали.
А так да, автоформатирование выручает, не раз проверял.
Теперь слышали =) Вообще php использую не настолько активно, чтобы разбираться с дебагерами под него, да еще и на удаленных сайтах, соответственно и код индусов до сих пор мне не попадался. Первый опыт.

"Важное" мнение мимокрокодила-питониста про xdebug: вчера впервые пытался его подружить с phpstorm, завелось, но evaluate expression обламывается на почти всём чуть сложнее арифметики :(


Возился с связкой xcode + iOS simulator + selenium2 + appium + behat, пытался получить что-то вроде ipython из которого смогу поэкспериментировать с интерактивным управлением мобильным safari из php.

Поэтому php-разработчиков и не любят: нет жестких рамок(как в python например касаемо форматирования), легаси-код, скрытие ошибок(код запустился без класса?), evalы, через которые легко можно вскрыть сайт. Но это ложь, их не любят по другой причине. Сам пишу на всем, в том числе на php. Не от языка программирования отношение зависит, а от людей. Просто php проще для входа, поэтому новичков в php больше, а значит больше легаси и косяков. Python на винду поставить сложнее, чем denwer. И слава байт-коду.
Питон как и денвер ставится через установщик.

Не надо про python… Тоже всякого пишут. Везде всякого пишут. И в императивных, и в декларативных, и в php, и в python и даже в строгом golang.

А как Вам вот такое (Delphi)?

procedure TPrintClass.GetPreview(ofsP:integer=0);
var rw, rp, cr, PhysM:TRect;
pw, ph, ww, wh, n:integer;
kx, ky, k, sc:double;
land:boolean;
ofs:TPoint;
MyRgn: HRGN;
mt, ml, mr, mb, kp:double;
Xi, Yi, i:integer;
Xmin1, Ymin1, Xmax1, Ymax1, x, y, w, h:integer;

И далее идет функция строк эдак на 300 в которой все эти замечательные переменные активно используются, умножаются, делятся, только разве что не размножаются, примерно как-то вот так:

kx:=ww/pw;
ky:=wh/ph;
k:=min(kx, ky);

rp.Right:=round(pw*k);
rp.Bottom:=round(ph*k);
rp.Left:=(bmp.Width — rp.Right + 50) div 2;
rp.Top:=(bmp.Height — rp.Bottom + 50) div 2;
inc(rp.Right, rp.Left);
inc(rp.Bottom, rp.Top);

Комментариев на эти 300 строчек ровно 0.
И вот надо тебе в этом замечательном превью что-то поменять слегонца :)
Один раз pw с ww перепутаешь — все: кровь, кишки, access violation.
И вроде понимаешь что надо их переименовать, но ведь чтобы переименовать надо же сначала понять что они значили по авторской задумке.

А у Вас тут прямо тепличные условия какие-то описаны.
Подытожу — есть такая профессия — в чужом *****-коде ковыряться.
300? Что так мало? Настоящие дельфисты пишут методы минимум по 5000 строк. В обработчике события. И названия переменных слишком понятные: Ymin1, Xmax1. Даёшь s,sss,s1, и конечно Button1! И на сладкое: использование {$include} и {$IF ()} для повторного использования кода.

Обычно, если есть такой код, то скорее всего где-то выше есть ещё и глобальные переменные с такими же именами)

Самое забавное что в стандарте (ИКД) GPS и ГЛОНАСС — ровно так. Назначения описаны, но названия переменных так похожи… И ведь не поменяешь — все уже привыкли именно к таким именам.
UFO landed and left these words here
Я однажды встречал что-то подобное, но с одним важным отличием — комментарии таки были, все что когда-то было в методе и теперь не используется оставлялось в виде закомментированного кода ибо системы контроля версии не использовались. Иногда там было по 3-4 экрана закомментированного кода.

Вот почему когда я разбираю код на Python после индусов, то сильно радуюсь что так


if (!function_exists('CutFromTo')){ function CutFromTo($string, $from, $to){$fstart = stripos($string, $from); $tmp = substr($string,$fstart+strlen($from)); $flen = stripos($tmp, $to);  return substr($tmp,0, $flen);}}


на нем писать нельзя.
UFO landed and left these words here
Эх, пока писал свой вариант, вы меня опередили…
Я тоже хотел с лямбдой сделать. Но в итоге решил, что это неспортивно, поэтому у меня всё-таки в две строчки.

if(not('cut_from_to' in dir())):
  def cut_from_to(string, from_, to): fstart = string.lower().find(from_.lower()) ; tmp = string[fstart + len(from_):]; flen = tmp.lower().find(to.lower()); return tmp[:flen]
Можно же в лямбду завернуть, будет примерно так же.

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

Вот черт, даже в голову не пришло такое написать. Заслужено схватил минусов :(((

На самом деле в этом плагине был еще довольно не плохой индуский код.
Его писал уверенный миддл индус.
Я серьезно.

Все эти шутки про идусский код оказались правдой и там таакооое бывает)
Лучше один раз увидеть:)

Последний раз, очень крутой индо-программист с окладом 400$ в неделю (это овердофига для индусов) удалил проект с качественным кодом на Laravel, где все было разложено по полочкам и работало. Вместо него он начал писать с нуля где каждая страница представляла из себя отдельный ПХП файл.
Естественно все интеграторы оплаты, кредитные карты и все такое были удалены вместе с проектом.
Дак вот он пытался открывать сайт интегратора через фрэйм и слать им запросы обычными ajax, которые естественно не принимались.
А клиент у меня спрашивал, мол как так, в предыдущей версии все работает.

Вобщем смех и грех:)
А вот у меня случай тоже интересный был с индусо-кодом на WordPress. Сайт парсил сам себя. Магазин на WooCommerce где пагинация в виде «бесконечного» скроллинга была организована крайне интересным способом. При обращении к определенному адресу, призванному на ajax запрос вернуть еще часть списка товаров, делался запрос к этому же сайту с помощью file_get_contents(), к странице с обычной пагинацией. Далее контент парсился с помощью библиотеки «Simple HTML DOM» c целью достать по селектору #content только ту часть страницы где товары. Ну и потом результат этих манипуляций возвращался.
Самое странное, что они делают такими сложными и трудными способами, что даже не понятно как они до них додумались)
Вот неужели он не догадался ввести переменную и отправлять ее, но сделал парсер.
Ну вот как так?)
Возможно, они, будучи не знакомы с основами, ищут решение, как им кажется, в наиболее логичном направлении. Как я выше привёл пример, использование {$include} для выноса повторяющегося кода в Delphi.

Тут была статья про написание программы генетическими алгоритмами:
Комбинируем куски кода до тех пор, пока не получим приемлемое решение.
Возможно индусы пишут похожим образом.
Вышеупомянутый когда-то парсил сайт и сейчас использует свои наработки.

Таких случаев море, в сети есть даже уроки, который учат ровно тому же самому. Видел лично)

Шутки про индусский код были весьма мной любимы, пока не достался мне в доработку проект после них. Файлы по шесть тысяч строк без комментариев осложнялись хаотичным именованием переменных — не более двух символов в имени. Вишенкой на торте было объявление функции в шаблоне страницы одного из самописных плагинов, вызываемой без всяких проверок и зависимостей в другом таком плагине. Думаю, у каждого, кто работал с индусским кодом, есть истории, как не надо писать.

Я хотел было написать, может кто-то специально использовал обфускатор чтобы защитить платный плагин, но потом прочёл все комментарии...

Самая большая проблема в том, что синтаксис


Спорно, синтаксис не запретит использовать eval, copy/paste programming и продавать свой говнокод.

Тут проблема в генетеке автора такого кода.
Only those users with full accounts are able to leave comments. Log in, please.

Please pay attention