Чуваки, помогите мне советом.
Так вышло, что я не очень опытен в написании сайтов, но вот пришлось взяться за один сайт.
Есть страничка скажем offers.php.
Схема кода такова:
if (isset($get[‘..’]))
{..
}
elseif (isset($get[‘..’]))
{

}

и так далее примерно 6 разних elseif.
То есть что-то выводится в зависимости от параметра. При этом в блоках сам код более-менее похож.
Скажите, это говнокод? В плане организации кода. Или как-то можно изменить такую схему?
Извините, если вопрос не к месту. Буду благодарен за совет.

Tagged with →  

143 Responses to Чуваки, помогите мне советом.

  1. 1p_Velo:

    пора бежать за попкорном…

  2. Kkebad:

    образцовый пятничный пост

  3. NaMVelo:

    Я понимаю), но я даже не знаю как сформулировать вопрос.
    Просто хочу знать если так устроен код, это нормально или нет?

  4. TneGood:

    Твой вопрос от глубинного непонимания. В принципе, можно даже знаменитую шутку про if (b.ToString().length < 5) {…} вообразить в реальной жизни 🙂 Ты вот пишешь про какие-то иссеты и elseif’ы, ну и какой вывод из этого можно сделать? Задавай конкретные вопросы, получай конкретные ответы, задавай тупые вопросы, любуйся людьми с попкорном в комментариях.

  5. 9nibad:

    Ты код пишешь для того, чтобы что-то заработало или кто-то оценил твой код?

  6. DraSnow:

    пятничный был мой

  7. Yksin:

    Код ужасный, elseif уже сто лет как никто не пользуется.

  8. HneZZ:

    не, тут ты не прав. Если кажется, что код кривой и хочется го поправить — то это можно только приветствовать

  9. RedSm:

    За излишний перфекционизм программистов увольняют с работы. Иногда нужно сдерживаться, даже если очень хочется.

  10. RaeTunes:

    а что используется?

  11. Mahno:

    switch и тернарные операторы, если не допускаются иные извращения, типа элвис-операторов

  12. AkhSpb:

    предположительная функция возвращает false, true, 0 или 1. Case?
    Если несколько переменных участвуют в общем if-elif-else блоке, тоже как-то не case, а много вложенных тернарок — не очень хороший стиль.

    Не надо так однозначно говорить, ситуации разные бывают.
    Опять же вопрос вкуса зачастую.

  13. AmtEkb:

    а что, switch быстрее, чем elseif?

  14. Yksin:

    JA, JAE, JB, JBE, JC, JCXZ, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ.

  15. 1p_Velo:

    я не веб разработчик, скорее, сочувствующий, вощем,
    подозреваю, что топикстартер начитался статей в рунете, про получение параметров передаваемых по get и put. Там таких isset валом, а сбоку может быть пример в 1 строчку, как проглотить все параметры, но, типа им пользоваться не надо, а то злые дяди хакеры что-нить попробуют переполнить, или своему, уже встроенному в апач вирусу пошлют аргументы.
    По этому, автор вопрошает, оставлять решение «в лоб», или делать красивое решение, с массивом токенов, чтобы оно типа было универсальным и для 2 и для 1000 параметров.
    (сорри за терминологию).
    Имхо, не трогать если понимаешь как оно работает, и оно работает. Явного тупака нет. А обработчик резинового числа параметров можно написать для более глубокого освоения пыха, поднятия ЧСВ и светлого будующего, сохраненного в библиотеке полезных собственных кусков кода. Быстрее оно работать вряд ли будет, т.к. выше интеграция и больше число задействованных функций.

  16. 1p_Velo:

    jr:jp:djnz:di:halt

  17. LamYes:

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

  18. HneZZ:

    а учиться как?

  19. NaMVelo:

    Я пишу, чтобы заработало, но всё-таки не хочется чтобы это было через жопу).
    Скорее всего кому-то другому потом придется разбираться в моем коде, и не хотелось бы, чтобы он подумал «блин что за школота это писала». К тому же для дальнейшего лучше уж сейчас узнать, как лучше писать. Ведь в книгах же не написано, какой стиль хороший, а какой дурацкий.

  20. NaMVelo:

    А этот комментарий я ну никак понять не могу).

  21. NaMVelo:

    Спасибо большое всем!

  22. RaeTunes:

    c 93-го года, когда мне казалось, что это круто и правильно, много воды утекло.

  23. 1p_Velo:

    когда подрастешь, станет насрать. АЛ вон, то чморит фрэймы, то говорит, что это круто (пруфы искать немного лениво). Да и опытный программист чужой код наврядли обзовет, если код работает без глюков и явного тупака, и скорее просто подумает по армянски :»мальчик делал, ничего, он научится».

  24. RedSm:

    Поправить потом, в рамках рефакторинга.

  25. 9nibad:

    вот когда на тебя наедут, спросишь как надо было сделать и все дела, даже не придется новый топик создавать

  26. XbiNo:

    на пхп скорее всего — всё равно. Однако когда у нас код близок к железу, то некоторые свитчи радостно становятся безусловными.

  27. Rehwhite:

    вроде на пхп даже

  28. AmtEkb:

    в процессе оптимизации кода компилятором/интерпретатором? Или как они могут стать безусловными? Не очень понял.

  29. Oveer:

    в elseif нельзя запихнуть while лол

  30. AmtEkb:

    мм, понял. Если сравнение происходит с последовательно возрастающими числами, то можно организовать массив с адресами перехода и делать что-то типа jmp addr_array[value];
    Я просто давно не сталкивался с таким случаем. Обычно на всякие строки проверяю.

  31. KriYes:

    и че получилось?

  32. DicZZ:

    Если код внутри блоков похож, то возможно имеет смысл переписать перенести в методы классов и прописать перегрузки и или template-методы, которые при необходимости перегрузить. А в начале ментата написать switch который создаст экземпляр нужного класса. Как-то так, в целом, но рефакторинг вещь непростая, поэтому тут надо уже предметно код анализировать

  33. DicZZ:

    простите, русская языка все …

  34. RedSm:

    Полиморфизм.

  35. UpaFcuk:

    Уж лучше как-то так:

    Намётка на MVC..
    Учи ООП, паттерны и не используй глобальную среду.

  36. KriYes:

    использовать глобальный массив внутри класса — это типа ок?

  37. IjdGood:

    а подавлять ошибки вместо isset — это какая-то магия?

  38. AmtEkb:

    интересно, как оба варианта работают на низком уровне. Ну, в смысле, на уровне байт-кода и всё такое. Какой лучше?

  39. UpaFcuk:

    Это для наглядности начинающему кодеру.

  40. UpaFcuk:

    Он суперглобальный

  41. UpaFcuk:

    Собака притормаживает всё, вызывая внутренние события по обработке ошибок

  42. AmtEkb:

    то есть isset всё-таки лучше?

  43. UpaFcuk:

    Да, грамотнее:
    isset($_GET[‘method’]) && $_GET[‘method’]? $_GET[‘method’] : ‘index’;

  44. AmtEkb:

    тогда уж
    if (isset($_GET[‘method’]))
    {
    $method_name = mb_strtolower(mb_substr($_GET[‘method’], 0, 32));
    if (isset(self::$validMethods[$method_name] )) $method = $method_name; else $method = ‘index’;
    }

  45. TefYes:

    а что плохого в использовании суперглобального массива внутри класса?

  46. TefYes:

    а это зачем? isset($_GET[‘method’]) && $_GET[‘method’]

  47. AmtEkb:

    а если в нём некорректный метод?

  48. AmtEkb:

    ой, я думал ты меня спрашиваешь. Что-то я совсем глючу 🙂

  49. KriYes:

    а если я хочу выполнить этот же метод на основании переменной из поста, сессии, куки или просто с произвольным значением?

  50. UpaFcuk:

    Если метод не указан, то запускаем метод index.

  51. UpaFcuk:

    Кстати за $validMethods, можно автоматически считать только public!

  52. UpaFcuk:

    т.е. сотри в сторону функции method_exists, privete и protected не видны из вне

  53. UpaFcuk:

    Программируешь router как тебе надо

  54. AmtEkb:

    method_exists тоже опасен, вообще-то 🙂

  55. NaMVelo:

    Я решил раз не все однозначно критиковали, то пока оставить то, что написал. А остальные страницы сделаю через switсh. Посмотрю, есть ли разница.

  56. NaMVelo:

    Да, еще попробую с классами разобраться, как посоветовали. Я правда с классами только на C в школе работал. Но думаю они везде одинаковые)

  57. NaMVelo:

    А в каком редакторе это написано?)

  58. Xuagreen:

    но это до сих пор круто!

  59. Xuagreen:

    пиздец… Нет, серьёзно.

  60. KriYes:

    а если я пока хуй знаю, как мне надо? Охуенный у тебя ооп.

  61. KriYes:

    напиши, как надо. Я тоже серьезно, я почти не пишу в стиле ооп, но, разумеется, понимаю, о чем там речь.

  62. Xuagreen:

    KISS — выбрасываем всё лишнее на хуй.

    1. Обращение к GET идёт на хуй, потому как это внешние данные. public static function route($method).
    2. За подавление ошибок надо расстреливать, поэтому $method = empty($method)? $method : ‘default’;
    3. Все входящие данные надо проверять, а так как мы обращаемся к методу класса, то надо проверить существование метода. Сегодня это просто фатальная ошибка без последствий, завтра — лёгший сервер. Поэтому if(method_exists($controller, $method)) call_user_func_array(array($controller, $method)) else throw new Exception();

  63. KriYes:

    значит, я все понял правильно, за исключением того, что если в методах сложная обработка — то я бы из них сделал классы.

  64. DnaSm:

    А смысл $_GET выносить в отдельную переменную? Мы когда-нибудь захотим route вызывать не используя данные из запроса?

  65. Xuagreen:

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

  66. Xuagreen:

    iam_weasel: мы можем поменять реврайт и имя переменной. Лучше пусть оно один раз инициализируется извне, чем нам потом поиском менять сто строчек и молиться, что мы ничего не испортим. Зачем гемморой растить, если можно без него и проще? Смысл в том, чтобы было проще. Не надо усложнять себе жизнь (:

  67. KriYes:

    iam_weasel: лучше объясни смысл этого не делать

  68. DnaSm:

    ну вроде сейчас иде умеют в мгновение ока переименовывать переменные

  69. DnaSm:

    прежде всего мы не множим строки кода

  70. Xuagreen:

    iam_weasel: наоборот. $_GET[‘method’] длинее, чем $method. Зачем печатать лишнее?

  71. Xuagreen:

    iam_weasel: название внутри $_GET и только в тех местах, которые нужны для рутера? Не смеши! Вот когда сделаешь как я говорю, тогда IDE тебе и будет помогать.

  72. UpaFcuk:

    У меня роутер действует таким образом, что через mod_rewrite передаются URL… Примерно так mysite.com/controller/method/param1/para m2/paramN

  73. KriYes:

    iam_weasel: чиво? Что-то не так в моей консерватории, видимо. Вместо того, чтобы задать входной параметр функции и забыть об этом навсегда, мы говорим о том, что ИДЕ умеют переименовывать переменные. А если мне захочется, чтобы роутер вызывался для переменной из поста, СОАПом и еще из командной строки — как быть?

  74. UpaFcuk:

    Eclipse + PDT. Устанавливаешь для Java, потом через Help инсталлишь PDT.

  75. Xuagreen:

    штука в том, что в данном случае IDE не поможет. А вот если сделать как научили в консерватории, то IDE поможет. Короче, не обращай на него внимания (: Человек сам себе гемморой растит.

  76. UpaFcuk:

    Я написал паттерн. А по-хорошему — вот, что надо для полноценного «ядра» MVC. Правда, это не совсем MVC. Модель и шаблонизатор вынесены в «модули».

    Linux Nix Web Development - http://linuxoids.org/ размер 196x252, 5.90 kb

  77. KriYes:

    я все понял. Нет, правда.

  78. UpaFcuk:

    Я спиздил архитектуру у CakePHP, облегчив и добавив пару фишек.

  79. AmtEkb:

    iam_weasel: да, например, когда будем тестировать класс.

  80. UpaFcuk:

    > Обращение к GET идёт на хуй, потому как это внешние данные. public static function route($method).
    Договорились же в глобальной среде ничего не мутить.

  81. Egaer:

    а что компайлер делает такой большой?

  82. UpaFcuk:

    Сканит и парсит PHP файлы, чтобы знать, где какие классы и методы есть. Позволяет перегрузить __autoload и сделать «систему событий» (чтобы вызвать все методы _on_MyEvent при event(‘myEvent’) ). Удобно для подключаемых модулей.

  83. Egaer:

    не тормозит под большой нагрузкой? Не проще просто регистрировать слушателей?

  84. UpaFcuk:

    Нет, не тормозит. Я при старте включаю скомпилированный php-файл с массивом «слушателей». Это даже быстрее, ведь если событие не произойдёт, то и лишних регистраций не будет.

  85. DnaSm:

    это если будем.

  86. RedSm:

    iam_weasel: Может и не будем, но мы привязываем класс к более широкому контексту, а это всегда плохо.

  87. DnaSm:

    тут прикол что сам язык нам это даёт сразу и по-умолчанию.
    Да я понимаю что мы привязываемся к более широкому контексту, но роутер сам по себе и занимается тем что разруливает поступившую от клиента инфу.

  88. DnaSm:

    ну для начала мы его должны присвоить.

  89. DnaSm:

    тогда переписывать, но зачем это делать с самого начала?

  90. Egaer:

    Прикольно) а перекомпилировать когда нужно?

  91. UpaFcuk:

    Если переименовываю файлы или классы, то в эклипсе нажимаю ctrl+b(uild) и стирается файл.success. Его отсутствие инициирует компиляцию. Так же в ряде ошибок происходит перекомпиляция. Не могу справится с тем, что иногда начинаются две компиляции сразу…

  92. Xuagreen:

    iam_weasel: нет, роутер занимается тем, что разруливает инфу, которую МЫ ему скармливаем. Его не должно ебать гетом нас просят или тестами или ещё чем. Не усложняй себе жизнь.

  93. DnaSm:

    а что мешает скармливать через location или переписывание $_GET?

  94. Egaer:

    Я в php не селен. Там записи в сессионые переменные тред-сефти? если да, то можно в сессии ставить флажок, типа компилируюсь, ждите.

  95. AmtEkb:

    и я не теллур

  96. Xuagreen:

    iam_weasel: ответь мне на вопрос — ЗАЧЕМ УСЛОЖНЯТЬ СЕБЕ ЖИЗНЬ?

  97. KriYes:

    ) слава богу, благодаря такому у меня всегда будет работа.

  98. DnaSm:

    а в чем усложнение?

  99. RedSm:

    iam_weasel: Тем, что ты даешь классу знание о том, о чем он знать не должен. Это выходит за пределы его контекста. Пусть ты на 300% уверен, что работать он будет только с этой переменной, это всё равно неправильно, ты херишь этим основные концепции ооп. С этого маленького компромисса в итоге вырастает плохая архитектура. Переписывание $_GET — это вообще шутка, надо понимать.

  100. DnaSm:

    А почему $_GET выходит за его контекст?

  101. RedSm:

    iam_weasel: Троллишь? Класс вообще не должен знать что за его пределами есть какие-то глобальные переменные. Ни get, ни post ни что-то ещё. Принимай этот массив в конструкторе и ты сразу отвязываешь класс от контекста какой-то конкретной переменной, он сразу может работать с любым массивом, не только суперглобальным. Даже если он ни с чем другим работать, вроде как, и не будет.

  102. UpaFcuk:

    может ещё тогда каждый раз класс строить, передевая туда $_SESSION и $_SERVER? Твоя концепция больше подходит для Javascript, там только одна «суперглобальная переменная» — window, её и передают в конструкторы.

  103. Xuagreen:

    пиздец… Вот у вас в голове насрали белки…

  104. AmtEkb:

    вообще, самое лучшее — это создать класс «приложение», которому передавать всякие $_GET, $_SESSION, $_SERVER и т.д. А уже это приложение пусть имеет объект роутера, которому будет передавать массив $session, который оно, в зависимости от условий, взять из $_SESSION или из базы по переменной ‘session_id’ в $get.

  105. DnaSm:

    Конечно троллю. Почему get выходит за контекст мне так и не объяснили.
    Почему у нас класс который по идее и работает с этим самым гетом должен ни с того ни с сего отрабатывать еще и пост и соап, мне не понятно.
    Обычно всё это отвязывание делает вместо суперглобальной переменной, абсолютно такой же синглтон, смысл которого только в ООП обертке. При том в каждом фрейморке вся эта радость может обзываться абсолютно по-разному.
    Это всё выглядит очень красиво и оопешно, но особой смысловой нагрузки не несёт.

  106. Xuagreen:

    iam_weasel: несёт, когда у тебя есть мозг, например. У тебя любой класс делает только то, что умеет делать и оперирует только теми данными, которые в нём хранятся. $_GET у тебя не хранится в классе.

    Если говорить про рутер, то смысл рутера в том, что их у тебя может быть куча. Ты делаешь интерфейс IRouter и наследуешь от него различные рутеры — для REST, для SOAP, для чего угодно. Так как смысл рутера всегда один, а разные схемы обрабатываются по-разному.

    Например, REST рутер не обрабатывает GET. Сюрприз!

    Но тебе не понять, да? Тогда встречный вопрос — на хуя тебе вообще ООП, если ты им не пользуешься? Чиста штобы пасаны не засмеяли?

  107. DnaSm:

    Интерфейс же можно в любой момент написать? Отнаследовать изолировав $_GET в любой момент можно?
    То что при REST и SOAP нам придется отдавать немного в другом виде данные тоже надо помнить, наверное.
    Спасибо что сразу перешел на личности в разговоре, я это очень ценю.
    ООП ведь не религия, а методология так почему на мой вопрос надо отвечать «потому»?
    ООП мне нужен для понимания других программистов и программ, некоторые приемы ООП помогают мне писать меньше кода.

  108. UpaFcuk:

    Да всё равно, $_GET[‘__url’] используется только в одном месте, как костыль для mod_rewrite (под NGINX также в get пихаю путь). Ко всем другим параметрам я имею доступ через core::$params. Как-то так:

  109. Xuagreen:

    iam_weasel: на вопрос «почему» всегда идёт ответ «потому». В данном случае причина в изоляции данных. Обьект в классовом ООП — это контейнер «данные + методы для их обработки». Всё что не хранится в обьекте передаётся параметрами.

  110. UpaFcuk:

    iam_weasel: Обработка SOAP не задача Router-а или Controller’а. Роутер выбирает контроллер, который запустит механизм работы с SOAP. Для этого надо пихать SOAP по нужному адресу: mysite.com/soapcontroller/eatme. Или php -f core.php sopacontroller/eatme

  111. DnaSm:

    роутеру же уже приходится как-то говорить объекту что к нам пришел соап, или нет?

  112. UpaFcuk:

    iam_weasel: Это контроллер определит, пришёл соап или нет. И вызовет 404 если надо.

  113. DnaSm:

    для $_GET мы вообще не можем осуществить изоляцию данных, единственное что нам остается это договорится что мы его берем из класса Application, а не напрямую или я не прав?

  114. DnaSm:

    а каким образом?

  115. UpaFcuk:

    iam_weasel: если в HTTP режиме — проверить, есть ли POST. Если есть, то проверить их с помощью SoapHelper class, например.

  116. UpaFcuk:

    Когда что-то идёт не так можно вызвать debug::error404 который выполнит errorController::error404 и срендерит страницу ошибки

  117. DnaSm:

    понятно, спасибо. А не проще это делать в рутере, передавая в метод еще и хелпер для вывода?

  118. UpaFcuk:

    iam_weasel: Я написал Router один раз и забыл про него. А из контроллеров вывожу файлы на скачивание, картинки, HTML, XML, JSON — всё что угодно. Указание особого пути внутри сайта для SOAP-шлюза ускоряет работу других страниц, т.к. не происходит анализ на SOAP каждый раз.

  119. TefYes:

    условие && $_GET[‘method’] ну вот никак не проверит существование метода.

  120. UpaFcuk:

    Это условие проверит, указан ли метод. Если нет, то юзаем дефолтный. Я рекомендую запускать только публичные методы, которые не начинаются с «_» и которых нет в родителе контроллера. Это всего лишь абстрактный паттерн для понимания начинающих кодеров пользу ООП.

  121. Xuagreen:

    iam_weasel: мы можем его брать и напрямую, не проблема. Просто это делает во время инициализации рутера:

    new Router($_GET);

  122. UpaFcuk:

    А если запуск в режиме командной строки? Придётся проверять режим и и потом уже выбирать параметры. А это уже похоже на задачу роутера.

  123. UpaFcuk:

    Прости, ступил, у меня самого
    SHELL? _core_router::route_shell() : _core_router::route()
    🙂

  124. DnaSm:

    и никакой соап рутер не понадобился в итоге.

  125. UpaFcuk:

    iam_weasel: Кстати, в аргументы метода обычно передаются части пути. Т.е. примерно так: mysite.com/controller/method/param1/para m2/paramN. Это все делает Router — возвращает метод, контроллер, масив аргументов.

  126. Xuagreen:

    кекеке

  127. YlFbad:

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

    It is recommended that you avoid «stacking» ternary expressions. PHP’s behaviour when using more than one ternary operator within a single statement is non-obvious…

  128. WeMhlam:

    Попкорн закончился(

  129. TefYes:

    : Это условие проверит, указан ли метод — каким макаром?

  130. UpaFcuk:

    перед логической операцией PHP конвертнёт $_GET[‘method’] в тип bool. Соответственно, если там 0 или пусто, то получится false.

  131. TefYes:

    вообще-то проверится только значение переменной. Потому как обращение к методу с таким именем может быть только в виде $_GET[‘method’]();

    Соответственно проверять наличие метода — method_exists($_GET[‘method’]);
    В переменной $_GET[‘method’] должно быть имя метода, то бишь строка. И в данном случае это условие будет выполняться всегда, если только содержимое $_GET[‘method’] не пусто.

  132. UpaFcuk:

    Я понял. Мы немного о разном говорим. Если наш посетитель забыл указать метод, то кидаем его на index — вот для чего это выражение. А проверки валидности метода у меня в этом примере вообще нет.

  133. TefYes:

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

  134. UpaFcuk:

    Проверяется, указан ли метод вообще, но не проверяется, указан ли он правильно.

  135. TefYes:

    Ещё раз: каким образом? Вы проверяете ТОЛЬКО значение переменной. С какого перепуга php полезет какой-то там метод проверять?

  136. UpaFcuk:

    Переменная называется «метод». Вот я проверяю, указана ли она, т.е. сказали ли, какой метод запускать ))

  137. UpaFcuk:

    Кстати, лучшим решением для синхронизации в PHP оказалась функция flock.

  138. Egaer:

    Не плохо.

Добавить комментарий