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 :: Как не нужно программировать чтобы вас не проклинали

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Zuldek
Отправлено: 19 Марта, 2013 - 15:39:29
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Сегодня была поставлена задача - спарсить свежие базы по 8 типам транспортных средств с нескольких сайтов: типы, названия, марки. После чего добавить их на авто-портал с объявлениями с функцией автокомплита во всех формах этих значений.

Подумал - ничего сложного, сделаю быстро. Но не тут-то было

Открыл базу - таблица с 28 полями для объявления сразу насторожила... - вздохнул и подумал - ладно, добью ещё 2 поля new_mark new_model: когда закончу работу, удалю старые поля, оставив только новые, сведя к ним старые объявления либо снесу старые поля через месяц (марки и модели для новых объявлений будут писаться в новые поля).

Спарсил пухлые таблицы с новыми марками и моделями (марок автомобилей порядка 1200 моделей 7400+), что кратно больше старых вариантов этих списков портала. Записал таблицы в бд, проиндексировал и т.п.

Дальше началось самое веселое. Открыв исходники портала, той его части, которая отвечала за добавление объявлений был шокирован... Как такового раздела не было а в конечном index.php раздела boards красовалось:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $_board->display();
  3. ?>

По спине пробежал холодок... .
Открываю, собственно сам класс... . У вас когда-нибудь глючил gedit на 4 ядрах и 4 гигах?
Наверняка это бывало при попытках открытия очень тяжелого дампа бд или подобных вещей. Я порядком уже отвык от всяких зависаний, подумав, что наверняка что-то другое подвесило машину. Однако убедившись что именно редактор отожрал все ресурсы полез смотреть свойства файла с классом... . Вам случалось видить метровые файлы board.inc.php с одним классом внутри? - Мне нет.
Когда gedit отрендерил файл, не без тормозов начал читать код...
Плохо стало почти сразу.
Не буду детально рассказывать, что я там увидел: и так ясно. Пыха, понятно, не самый строгий к разделению логики от представления и т.п., - это понятно, но... мой include_once для autocomplite.php был единственным (!) инклудом, использующимся для вывода всего этого чертового раздела! Исключая
CODE (htmlphp):
скопировать код в буфер обмена
  1. include dirname(__FILE__) . "/config.inc.php";

В котором 7 строк настроек и массивы и пары сотен значений моделей, марок и типов!!!
Все это настолько перекорежило, что дальше все объектные вызовы вроде

казались уже наглой издевкой автора, которого хотелось найти и задушить! А после этого ещё зажарить и утопить! Он ещё не поленился: в класс все это упаковал! Типа так и должно быть: "всё лаконично и аккуратно у меня!"... .

Уже тогда понял что разделениями, даже условными на логику, модели и шаблоны там и не пахнет... . Для каждого типа транспортного средства (8) в зависимости от действия (продажа, покупка, аренда, ...), каждого действия класса(!!!) (редактирование, выввод, добавление, удаление) это существо прописывало отдельную форму, отдельную обработку и отдельный запрос к бд!
Правда тут, все-таки выводил запрос в обертке $b->query("...")), собранной в конфиге - "Ну как же, я же крутой программист!". Представляете в какое развлечение превратилась бы простая на первый взгляд задача написать и подцеплять атокомпликт к этого многоэтажным switch case и сохранять конечный файл с тормозами и вылетами редактора?! Огорчение
Решил наследовать класс, определив новый метод, который бы до вывода переопределял его этажные формы и запросы к базе, ту их часть, где есть выбор модели и марки транспорта, производя отдельное их сохранение и редактирование.
Проделав все это, с нервной дрожью обнаружил, что для некоторых типов тс нововведение почему-то не работает.
Потратив ещё с пол-часа обнаружил что некоторые типы тс, оказывается, не определены в конфиге!!! Они определены в самом классе!!! А для их отлова, обработки и записи, минуя семиэтажные switch case Бил Гейтс написа даже отдельный метод Listener и по Get-Post параметрам отдельно, отлавливал, редактировал и добавлял в базу объявления этих типов!!! Видимо Кулибину стало плохо искать концы в своем же коде и для добавления новых типов придумал отдельный метод в котором определил такую-же этажерку. Правильно, - после него хоть атомная война... .

В общем, пока с этим не столкнешься все это кажется очень смешно и весело, но когда эти животные (да, они животные!!!) берутся писать проекты серьёзнее собственной персональной страницы, получается вот такое убожество!

Никогда не пренебрегайте советами, выработанными хорошими методиками программирования! Используйте паттерны! Комментируйте свой код!!! Не пытайтесь изобразить ООП если вы не понимаете что это такое и как оно должно быть реализовывано!!! Программируйте лучше процедурно, но чисто и понятно!

(Отредактировано автором: 19 Марта, 2013 - 15:58:53)

 
 Top
EuGen Администратор
Отправлено: 19 Марта, 2013 - 16:52:13
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В "обсуждение статей", цикл, продолжающий эту статью.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DelphinPRO
Отправлено: 19 Марта, 2013 - 17:43:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Zuldek пишет:
Никогда не пренебрегайте советами, выработанными хорошими методиками программирования!
Хорошо бы еще знать эти методики, прежде чем начинать кодить.


Zuldek, Сочувствую Улыбка Справились? обошлись без рефакторинга?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
esterio
Отправлено: 19 Марта, 2013 - 18:20:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Искрине сочуствую. Теперь я понимаю что у меня все удалось. Так как достался проект написан на Yii. Но там не так как у Ва все разделено(ето ж Yii), но бл* за каждую @ перед каждым
$_POST, $_GET, $_SESSION, $_REQUEST, $_COOKIE убил бы. Есть еще мелкие недочеты с архитектурой базы и прочее но ето не на столько критично
 
 Top
Zuldek
Отправлено: 19 Марта, 2013 - 18:23:11
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




DelphinPRO пишет:
Zuldek, Сочувствую Улыбка Справились? обошлись без рефакторинга?



Сейчас отдохну и домучаю эту задачу. Тут даже не рефакторинг - тут брать проект и заново переписывать с 0, ибо весь сделан как этот класс. Задачу эту уже поставили в очередь.

(Отредактировано автором: 19 Марта, 2013 - 18:28:28)

 
 Top
nerv
Отправлено: 21 Марта, 2013 - 11:22:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




Zuldek пишет:
В общем, пока с этим не столкнешься все это кажется очень смешно и весело, но когда эти животные (да, они животные!!!) берутся писать проекты серьёзнее собственной персональной страницы, получается вот такое убожество!

повезло, однако Улыбка

esterio пишет:
за каждую @ перед каждым
$_POST, $_GET, $_SESSION, $_REQUEST, $_COOKIE убил бы

я ток вникаю в php кодинг, но подавление ошибок таким образом - зло

Сори за оффтоп, вопрос по стилю кода:
В большинстве примеров, кот. попадались мне на глаза (имеется ввиду язык php), переменные (их объявление), было разбросано по коду. Это так принято или все-таки тру-php-coder объявляет переменные в одном месте? Вообще, в php есть такое понятие, как "объявление переменной"?


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 21 Марта, 2013 - 11:46:14
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




nerv пишет:
Вообще, в php есть такое понятие, как "объявление переменной"?
я бы так не называл
скорее есть инициализация(ее бы хорошо производить все-таки)
и лучше ее производить перед использованием
память экономим
ведь возможно переменная понадобится по условию
 
 Top
Мелкий Супермодератор
Отправлено: 21 Марта, 2013 - 11:47:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 21 Марта, 2013 - 12:06:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




пожалуй стоит добавить что обработку входящих данных лучше всеже производить самым первым действием
 
 Top
imya
Отправлено: 21 Марта, 2013 - 13:08:54
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




Мелкий пишет:
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.

И почему эту рекомендацию никто не применяет ? Огорчение
В некоторых случаях было бы весьма удобно, а то увидел переменную в начале объявленную и ищи в коде, где она юзается...


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 21 Марта, 2013 - 13:31:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




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

А еще, задумавшись чего ж так долго грузится страница, мы долго ржали в голос с напарником, когда вывели сколько запросов к БД на обычной странице, делала наша корпоративная ЦМС - их там было 219!

Так что я все это прошел, копаясь в самой самой глубине колодца Улыбка

На сладкое IE expression:
Прикреплено изображение (Нажмите для увеличения)
ms.jpg
 
 Top
nerv
Отправлено: 21 Марта, 2013 - 18:10:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




imya пишет:
И почему эту рекомендацию никто не применяет ?

я объявляю в начале функции Улыбка На мой взгляд так легче отследить, какие переменные используются.

Мелкий пишет:
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится

ну вот объявили одну там, одну здесь и еще здесь. Как потом их все отследить? Еще ведь и параметры приходят (зачастую). Когда переменные объявлены все в одном месте - начале функции, сразу видно сколько их, что есть параметр, а не переменная.


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 21 Марта, 2013 - 18:13:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




nerv пишет:
Как потом их все отследить?
а чего за ними следить?
где используются там и определяются
(Добавление)
впрочем делай как считаешь
довольно скоро передумаешь))
 
 Top
nerv
Отправлено: 21 Марта, 2013 - 19:26:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




LIME пишет:
а чего за ними следить?
где используются там и определяются

применительно к php, наверно, да. Как я понял, тут переменная НЕ может быть не определена, т.к. отсутствует понятие "директива объявления переменной". Только

в начале функции пишут если нужно.


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 21 Марта, 2013 - 19:32:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




global признак плохой структуры кода
nerv пишет:
НЕ может быть не определена
не совсем
PHP:
скопировать код в буфер обмена
  1. $a.='qqq';//не определена генерирует нотайс...фуфу
  2. $a='';
  3. $a.='qqq';//определяем передиспользованием
еще учти что в пыхе нет вложенных ф-ций и соответственно scope
это я о определении в 1 месте
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Обсуждение статей »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB