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
Форумы портала PHP.SU :: Версия для печати :: Как не нужно программировать чтобы вас не проклинали
Форумы портала PHP.SU » Разное » Обсуждение статей » Как не нужно программировать чтобы вас не проклинали

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

1. Zuldek - 19 Марта, 2013 - 15:39:29 - перейти к сообщению
Сегодня была поставлена задача - спарсить свежие базы по 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 параметрам отдельно, отлавливал, редактировал и добавлял в базу объявления этих типов!!! Видимо Кулибину стало плохо искать концы в своем же коде и для добавления новых типов придумал отдельный метод в котором определил такую-же этажерку. Правильно, - после него хоть атомная война... .

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

Никогда не пренебрегайте советами, выработанными хорошими методиками программирования! Используйте паттерны! Комментируйте свой код!!! Не пытайтесь изобразить ООП если вы не понимаете что это такое и как оно должно быть реализовывано!!! Программируйте лучше процедурно, но чисто и понятно!
2. EuGen - 19 Марта, 2013 - 16:52:13 - перейти к сообщению
В "обсуждение статей", цикл, продолжающий эту статью.
3. DelphinPRO - 19 Марта, 2013 - 17:43:48 - перейти к сообщению
Zuldek пишет:
Никогда не пренебрегайте советами, выработанными хорошими методиками программирования!
Хорошо бы еще знать эти методики, прежде чем начинать кодить.


Zuldek, Сочувствую Улыбка Справились? обошлись без рефакторинга?
4. esterio - 19 Марта, 2013 - 18:20:18 - перейти к сообщению
Искрине сочуствую. Теперь я понимаю что у меня все удалось. Так как достался проект написан на Yii. Но там не так как у Ва все разделено(ето ж Yii), но бл* за каждую @ перед каждым
$_POST, $_GET, $_SESSION, $_REQUEST, $_COOKIE убил бы. Есть еще мелкие недочеты с архитектурой базы и прочее но ето не на столько критично
5. Zuldek - 19 Марта, 2013 - 18:23:11 - перейти к сообщению
DelphinPRO пишет:
Zuldek, Сочувствую Улыбка Справились? обошлись без рефакторинга?



Сейчас отдохну и домучаю эту задачу. Тут даже не рефакторинг - тут брать проект и заново переписывать с 0, ибо весь сделан как этот класс. Задачу эту уже поставили в очередь.
6. nerv - 21 Марта, 2013 - 11:22:42 - перейти к сообщению
Zuldek пишет:
В общем, пока с этим не столкнешься все это кажется очень смешно и весело, но когда эти животные (да, они животные!!!) берутся писать проекты серьёзнее собственной персональной страницы, получается вот такое убожество!

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

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

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

Сори за оффтоп, вопрос по стилю кода:
В большинстве примеров, кот. попадались мне на глаза (имеется ввиду язык php), переменные (их объявление), было разбросано по коду. Это так принято или все-таки тру-php-coder объявляет переменные в одном месте? Вообще, в php есть такое понятие, как "объявление переменной"?
7. LIME - 21 Марта, 2013 - 11:46:14 - перейти к сообщению
nerv пишет:
Вообще, в php есть такое понятие, как "объявление переменной"?
я бы так не называл
скорее есть инициализация(ее бы хорошо производить все-таки)
и лучше ее производить перед использованием
память экономим
ведь возможно переменная понадобится по условию
8. Мелкий - 21 Марта, 2013 - 11:47:43 - перейти к сообщению
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.
9. LIME - 21 Марта, 2013 - 12:06:06 - перейти к сообщению
пожалуй стоит добавить что обработку входящих данных лучше всеже производить самым первым действием
10. imya - 21 Марта, 2013 - 13:08:54 - перейти к сообщению
Мелкий пишет:
Даже в строго типизированных языках рекомендуется объявлять переменные как можно ближе к месту непосредственного использования. При чтении код меньше листать приходится.

И почему эту рекомендацию никто не применяет ? Огорчение
В некоторых случаях было бы весьма удобно, а то увидел переменную в начале объявленную и ищи в коде, где она юзается...
11. DeepVarvar - 21 Марта, 2013 - 13:31:58 - перейти к сообщению
Zuldek пишет:
В общем, пока с этим не столкнешься все это кажется очень смешно и весело
Я целый год на одном из предыдущих мест работы, разгребал такие горе-сайты.. Зубная клиника, пиломатериалы, детсткие праздники, пр.. Каждый из них - шедевр ГК, хоть весь код выкладывай.

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

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

На сладкое IE expression:
12. nerv - 21 Марта, 2013 - 18:10:16 - перейти к сообщению
imya пишет:
И почему эту рекомендацию никто не применяет ?

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

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

ну вот объявили одну там, одну здесь и еще здесь. Как потом их все отследить? Еще ведь и параметры приходят (зачастую). Когда переменные объявлены все в одном месте - начале функции, сразу видно сколько их, что есть параметр, а не переменная.
13. LIME - 21 Марта, 2013 - 18:13:16 - перейти к сообщению
nerv пишет:
Как потом их все отследить?
а чего за ними следить?
где используются там и определяются
(Добавление)
впрочем делай как считаешь
довольно скоро передумаешь))
14. nerv - 21 Марта, 2013 - 19:26:57 - перейти к сообщению
LIME пишет:
а чего за ними следить?
где используются там и определяются

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

в начале функции пишут если нужно.
15. LIME - 21 Марта, 2013 - 19:32:52 - перейти к сообщению
global признак плохой структуры кода
nerv пишет:
НЕ может быть не определена
не совсем
PHP:
скопировать код в буфер обмена
  1. $a.='qqq';//не определена генерирует нотайс...фуфу
  2. $a='';
  3. $a.='qqq';//определяем передиспользованием
еще учти что в пыхе нет вложенных ф-ций и соответственно scope
это я о определении в 1 месте

 

Powered by ExBB FM 1.0 RC1