Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как не нужно программировать чтобы вас не проклинали
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
Сегодня была поставлена задача - спарсить свежие базы по 8 типам транспортных средств с нескольких сайтов: типы, названия, марки. После чего добавить их на авто-портал с объявлениями с функцией автокомплита во всех формах этих значений.
Подумал - ничего сложного, сделаю быстро. Но не тут-то было
Открыл базу - таблица с 28 полями для объявления сразу насторожила... - вздохнул и подумал - ладно, добью ещё 2 поля new_mark new_model: когда закончу работу, удалю старые поля, оставив только новые, сведя к ним старые объявления либо снесу старые поля через месяц (марки и модели для новых объявлений будут писаться в новые поля).
Спарсил пухлые таблицы с новыми марками и моделями (марок автомобилей порядка 1200 моделей 7400+), что кратно больше старых вариантов этих списков портала. Записал таблицы в бд, проиндексировал и т.п.
Дальше началось самое веселое. Открыв исходники портала, той его части, которая отвечала за добавление объявлений был шокирован... Как такового раздела не было а в конечном index.php раздела boards красовалось:
По спине пробежал холодок... .
Открываю, собственно сам класс... . У вас когда-нибудь глючил gedit на 4 ядрах и 4 гигах?
Наверняка это бывало при попытках открытия очень тяжелого дампа бд или подобных вещей. Я порядком уже отвык от всяких зависаний, подумав, что наверняка что-то другое подвесило машину. Однако убедившись что именно редактор отожрал все ресурсы полез смотреть свойства файла с классом... . Вам случалось видить метровые файлы board.inc.php с одним классом внутри? - Мне нет.
Когда gedit отрендерил файл, не без тормозов начал читать код...
Плохо стало почти сразу.
Не буду детально рассказывать, что я там увидел: и так ясно. Пыха, понятно, не самый строгий к разделению логики от представления и т.п., - это понятно, но... мой include_once для autocomplite.php был единственным (!) инклудом, использующимся для вывода всего этого чертового раздела! Исключая
В котором 7 строк настроек и массивы и пары сотен значений моделей, марок и типов!!!
Все это настолько перекорежило, что дальше все объектные вызовы вроде
казались уже наглой издевкой автора, которого хотелось найти и задушить! А после этого ещё зажарить и утопить! Он ещё не поленился: в класс все это упаковал! Типа так и должно быть: "всё лаконично и аккуратно у меня!"... .
Уже тогда понял что разделениями, даже условными на логику, модели и шаблоны там и не пахнет... . Для каждого типа транспортного средства (8) в зависимости от действия (продажа, покупка, аренда, ...), каждого действия класса(!!!) (редактирование, выввод, добавление, удаление) это существо прописывало отдельную форму, отдельную обработку и отдельный запрос к бд!
Правда тут, все-таки выводил запрос в обертке $b->query("...")), собранной в конфиге - "Ну как же, я же крутой программист!". Представляете в какое развлечение превратилась бы простая на первый взгляд задача написать и подцеплять атокомпликт к этого многоэтажным switch case и сохранять конечный файл с тормозами и вылетами редактора?!
Решил наследовать класс, определив новый метод, который бы до вывода переопределял его этажные формы и запросы к базе, ту их часть, где есть выбор модели и марки транспорта, производя отдельное их сохранение и редактирование.
Проделав все это, с нервной дрожью обнаружил, что для некоторых типов тс нововведение почему-то не работает.
Потратив ещё с пол-часа обнаружил что некоторые типы тс, оказывается, не определены в конфиге!!! Они определены в самом классе!!! А для их отлова, обработки и записи, минуя семиэтажные switch case Бил Гейтс написа даже отдельный метод Listener и по Get-Post параметрам отдельно, отлавливал, редактировал и добавлял в базу объявления этих типов!!! Видимо Кулибину стало плохо искать концы в своем же коде и для добавления новых типов придумал отдельный метод в котором определил такую-же этажерку. Правильно, - после него хоть атомная война... .
В общем, пока с этим не столкнешься все это кажется очень смешно и весело, но когда эти животные (да, они животные!!!) берутся писать проекты серьёзнее собственной персональной страницы, получается вот такое убожество!
Никогда не пренебрегайте советами, выработанными хорошими методиками программирования! Используйте паттерны! Комментируйте свой код!!! Не пытайтесь изобразить ООП если вы не понимаете что это такое и как оно должно быть реализовывано!!! Программируйте лучше процедурно, но чисто и понятно!
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
В "обсуждение статей", цикл, продолжающий эту статью.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DelphinPRO
Отправлено: 19 Марта, 2013 - 17:43:48
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Zuldek пишет:
Никогда не пренебрегайте советами, выработанными хорошими методиками программирования!
Хорошо бы еще знать эти методики, прежде чем начинать кодить.
Zuldek, Сочувствую Справились? обошлись без рефакторинга?
----- Чем больше узнаю, тем больше я не знаю.
esterio
Отправлено: 19 Марта, 2013 - 18:20:18
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Искрине сочуствую. Теперь я понимаю что у меня все удалось. Так как достался проект написан на Yii. Но там не так как у Ва все разделено(ето ж Yii), но бл* за каждую @ перед каждым
$_POST, $_GET, $_SESSION, $_REQUEST, $_COOKIE убил бы. Есть еще мелкие недочеты с архитектурой базы и прочее но ето не на столько критично
Zuldek
Отправлено: 19 Марта, 2013 - 18:23:11
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
DelphinPRO пишет:
Zuldek, Сочувствую Улыбка Справились? обошлись без рефакторинга?
Сейчас отдохну и домучаю эту задачу. Тут даже не рефакторинг - тут брать проект и заново переписывать с 0, ибо весь сделан как этот класс. Задачу эту уже поставили в очередь.
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Помог: 9 раз(а)
Zuldek пишет:
В общем, пока с этим не столкнешься все это кажется очень смешно и весело, но когда эти животные (да, они животные!!!) берутся писать проекты серьёзнее собственной персональной страницы, получается вот такое убожество!
повезло, однако
esterio пишет:
за каждую @ перед каждым
$_POST, $_GET, $_SESSION, $_REQUEST, $_COOKIE убил бы
я ток вникаю в php кодинг, но подавление ошибок таким образом - зло
Сори за оффтоп, вопрос по стилю кода:
В большинстве примеров, кот. попадались мне на глаза (имеется ввиду язык php), переменные (их объявление), было разбросано по коду. Это так принято или все-таки тру-php-coder объявляет переменные в одном месте? Вообще, в php есть такое понятие, как "объявление переменной"?
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
LIME
Отправлено: 21 Марта, 2013 - 11:46:14
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
nerv пишет:
Вообще, в php есть такое понятие, как "объявление переменной"?
я бы так не называл
скорее есть инициализация(ее бы хорошо производить все-таки)
и лучше ее производить перед использованием
память экономим
ведь возможно переменная понадобится по условию
Мелкий
Отправлено: 21 Марта, 2013 - 11:47:43
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.
----- PostgreSQL DBA
LIME
Отправлено: 21 Марта, 2013 - 12:06:06
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
пожалуй стоит добавить что обработку входящих данных лучше всеже производить самым первым действием
imya
Отправлено: 21 Марта, 2013 - 13:08:54
Участник
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012 Откуда: Запорожье, Украина
Помог: 19 раз(а)
Мелкий пишет:
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.
И почему эту рекомендацию никто не применяет ?
В некоторых случаях было бы весьма удобно, а то увидел переменную в начале объявленную и ищи в коде, где она юзается...
Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
DeepVarvar
Отправлено: 21 Марта, 2013 - 13:31:58
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Zuldek пишет:
В общем, пока с этим не столкнешься все это кажется очень смешно и весело
Я целый год на одном из предыдущих мест работы, разгребал такие горе-сайты.. Зубная клиника, пиломатериалы, детсткие праздники, пр.. Каждый из них - шедевр ГК, хоть весь код выкладывай.
А еще, задумавшись чего ж так долго грузится страница, мы долго ржали в голос с напарником, когда вывели сколько запросов к БД на обычной странице, делала наша корпоративная ЦМС - их там было 219!
Так что я все это прошел, копаясь в самой самой глубине колодца
На сладкое IE expression: Прикреплено изображение (Нажмите для увеличения)
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Помог: 9 раз(а)
imya пишет:
И почему эту рекомендацию никто не применяет ?
я объявляю в начале функции На мой взгляд так легче отследить, какие переменные используются.
Мелкий пишет:
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится
ну вот объявили одну там, одну здесь и еще здесь. Как потом их все отследить? Еще ведь и параметры приходят (зачастую). Когда переменные объявлены все в одном месте - начале функции, сразу видно сколько их, что есть параметр, а не переменная.
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
LIME
Отправлено: 21 Марта, 2013 - 18:13:16
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
nerv пишет:
Как потом их все отследить?
а чего за ними следить?
где используются там и определяются (Добавление)
впрочем делай как считаешь
довольно скоро передумаешь))
nerv
Отправлено: 21 Марта, 2013 - 19:26:57
Посетитель
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Помог: 9 раз(а)
LIME пишет:
а чего за ними следить?
где используются там и определяются
применительно к php, наверно, да. Как я понял, тут переменная НЕ может быть не определена, т.к. отсутствует понятие "директива объявления переменной". Только
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.