1. PHP / Говнокод #14430

    +155

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    try
    {
      return ($image = $this->row->image()->first())
        ? $image->{$this->imageAlias}
        : dummyThumbnail($this->imageAlias)
      ;
    }
    catch(\Exception $e)
    {
      if ($e->getMessage() === 'Method [image] is not defined on the Query class.')
      {
          $val = parent::value();
          return (is_string($val) and \Str::contains($val, 'http://'))
            ? $val
            : $this->row->getImageSrc($this->name, $this->imageAlias)
          ;
      }
    
      throw new \Exception($e->getMessage(), $e->getCode());
    }

    Запостил: mobileka, 28 Января 2014

    Комментарии (96) RSS

    • Надо было объяснить суть моего говнокода, наверно.

      Есть три способа хранения картинок в БД:
      1) веб-путь (http://...)
      2) имя файла (image.png)
      3) id картинки в таблице uploads (это если много картинок привязывается)

      Перед вами кусок кода, не знающий, каким образом она сохранена, который пытается получить путь к картинке, Если есть метод image() у объекта модели (хранится в $this->row), то это третий случай. Если его нет, то будет выброшено исключение, не имеющее кода, но имеющее сообщение 'Method [image] is not defined on the Query class.'.
      Дальше должно быть понятно.
      Ответить
      • Какая то черная магия. Без знания шаманского танца и не разберешься что же происходит. ИМХО надо в объекта хранить где картинка что бы пляски не устраивать.
        Ответить
        • Сложность в том, что это часть компонента корпоративного фреймворка. Код из примера должен быть универсален и работать со всеми существующими модулями без необходимости что-то менять в них. Раньше был один способ хранить картинки, а теперь - три: я не придумал ничего лучше пока.

          Только что обнаружил, что в случае 1 и 2 модель расширяет класс ImageModel, а в третьем случае - просто Base\Model. Можно строить на этом, но опять же существует риск, что кто-то придумает еще один класс, который не будет расширять ни один из двух вышеперечисленных, и тогда компонент сломается.

          Мой же пример во-первых не оптимален в случаях 1 и 2 (сначала дело доходит до исключения и только потом выполняется нужный код), во-вторых, кто-то может изменить сообщение исключения, в-третьих кто-то может создать метод image() в классе модели, в-четвертых, как вы отметили, для понимания кода нужна как минимум степень бакалавра по специальности "шаман" :)
          Ответить
          • поэтому делаем так создаем еще одну модель пусть в ней будет хранится id объекта и инфа о том где как хранится картинка. + делаем метод для извлечения картинки. все тонкости прячем внутри этой модели на ружу пусть торчит один метод getImg.
            При создании объекта модель наполняется нужной инфой и аккуратно укладывается в БД до лучших времен.
            Сложность в том что надо писать скрипт который пройдется по всем объектам и создаст записи в этой модели. Если появится новый способ хранения то надо будет править 1 класс.
            Ответить
            • Если я все правльно понял и мне хватило фантазии, то возникает вопрос о том, как обновлять данные этой модели при редактировании данных других моделей. Допустим, в одном из модулей изменили картинку. Либо нужно выбрасывать event и потом обрабатывать, либо писать логику в модели каждого модуля / базовой модели. В дальнейшем в каждом новом модуле тоже надо будет учитывать этот факт, что создает дополнительное соглашение, что в свою очередь повышает порог вхождения и увеличивает вероятность возникновения ошибки. А еще в третьем случае надо будет делать два джоина, чтобы получить картинку :)
              Ответить
              • У вас что модули меняют объекты где и как захотят??? Я бы сделал класс который изменял бы объекты. А еще лучше несколько классов что бы изменял объект определенного типа. Вы ему пачку данных он вам созданный , измененный объект (патерн фабрика в общем) все модули юзают эти фабрики. Сами модули до такой черновой работы опускаться не должны они должны решать задачи бизнес логики.
                Ответить
                • У нас, само собой, есть фабрики во фреймворке :) Вы немного недопоняли суть задачи, но это не ваша проблема, а недостатка данных. Думаю, здесь - не лучшее место для обсуждения деталей реализации, но все равно спасибо за помощь. Возможно, что-нибудь и вытяну из предложенного вами ;)
                  Ответить
          • Ну можно хотя-бы в 19 строке throw $e; дальше делать, а не грохать вот так стек вызовов оригинала?
            Ответить
            • Спасибо, я не знал, что так можно делать.
              Ответить
              • А... Тогда ладно. :) Пожалуйста. :)

                Что-то я переработался с индусами, похоже... Забыл что некоторые люди умеют учиться. :) Твой ответ меня в ступор ввёл секунд на 10. 8-)
                Ответить
    • Что это за магические обратные слеши?
      Ответить
      • Это же разделители пространств имён в php
        Ответить
      • Переходите хотя бы на 5.3 уже, а еще лучше - на 5.4 или 5.5! :)
        Ответить
        • врядли жавистам следует переходить на php 5.4
          Ответить
          • Судя по говнокодам, этот человек - эникийщик :)
            Ответить
            • Умение видеть говнокод более чем на одном языке приравнивается к эникейству?
              Ответить
              • Роман, сейчас мы будем обсуждать, кто как понимает слово "эникейщик", потом - является ли someone эникейщиком, далее - стоит ли ему переходить на php и в частности на версию 5.4, а потом другие глупости и сферические сущности в вакууме. Давайте лучше заниматься делом ;)
                Ответить
                • http://lurkmore.to/Компьютерный_слэнг


                  эникей/эникейщик — компьютерщик, выполняющий простую работу, не требующую высокой квалификации (переустановка windows, замена картриджей в принтерах и т. д.)

                  (close-thread :force)
                  Ответить
                  • Я не хотел никого обидеть. В моем кругу эникейщиками называют тех программистов, которым нет большой разницы, на каком языке писать.
                    Ответить
                    • в этом кругу похоже все эникейщики
                      Ответить
                      • надо использовать политкорректное "полиглоты"
                        Ответить
                        • пылеглоты
                          Ответить
                        • скорее СШП
                          Ответить
                          • СШП это кто ?
                            Ответить
                            • Соединённые Штаты Пиндосии
                              Ответить
                              • Чёрт, до чего меня интернеты довели :(
                                Я думал, политкорректность, толерантность, Пиндостан, думал, kegdan что-то на ассоциативных связях построил.
                                Ответить
                                • Ахаха, Кегдан всех наебал, Кегдан молодец, люблю его
                                  Ответить
                            • <Оффтоп>У тебя там на гвфоруме спамботы беснуются, надо бы их прибить.</Оффтоп>
                              Ответить
                              • Уже. похлопал, Сижу пишу антиботовскую защиту во избежаие дальнейших.
                                Ответить
                          • мысль выглядит немного незаконченной. коллега, поясните её, пожалуйста
                            Ответить
                            • специалист широкого профиля
                              Ответить
                              • Доширадчик не ?
                                Ответить
                                • нет.доширакчик делает потому что у него выбора нет, ибо он знает все на уровне хеллоуворд.
                                  СШП же напротив занимается всем профессионально и обычно потому что кроме него никто в это не разбирается. он может и жабу трахнуть гугловым ведром, и сайт на рельсы прокинуть, и на сях драйвер для usb девайса написать и все качественно. Такие люди обычно либо добровольно кодят все подряд (обычно мяготку, выкидывание на допил спецам пониже) либо сами ниче не кодят, но передают спец бесценный опыт и пиздюля
                                  Ответить
                                  • >но передают спец бесценный опыт и пиздюля
                                    У нас в конторе работает такой.Ни разу не программист но блять лучше всех знает ,что да как, надо прожить и сколько надо времени для этого. Очень обижается будучи послан на хуй. Он дескать идею разрабатывает. Пусть кажды занимается своим делом я тоже могу странной рулить но не берусь же.
                                    Ответить
                                    • не, это не СПШ, это ЧСВ.
                                      Ответить
                                    • Зачем рулить странной? Странная сама собой порулит.
                                      Ответить
                                    • > Пусть кажды занимается своим делом
                                      В маленькой конторе не получается сосредоточиться на чем-то одном :( Вот и получается и на сишке/крестах пилец, и на флешефлексе/пыхе/жс/пёрле/жабе/питоне срец, такой как я. Да еще и админ и техподдержка в одном флаконе (прощай "состояние потока", я буду о тебе скучать). Все вместе, и ничего на должном уровне.

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

                                      Так что СШП это далеко не всегда хорошо... Хотя, с другой стороны, интересно и моск не засохнет от постоянной работы с одной технологией.
                                      Ответить
                                      • хороший программист всегда должен иметь хорошее представление, что происходит в ide соседа, который ему пишет бекенд/фронтенд/бд (ненужное подчернуть)

                                        а полезный - еще и ориентироваться в альтернативных мирах, будучи готовым провести своевременные параллели

                                        поэтому сшп нужны чуть менее чем везде
                                        Ответить
                • "ему" - "ей"
                  >FIXED
                  Ответить
              • Все, я - эникейщик, пойду повешусь ;(
                Ответить
          • нихера себе дискуссию на пустом месте развили. я вот джавист, но вполне себе свободно пишу и на пхп, и других языках, типа perl.
            но вот C\C++ ненавижу - там даже такая безобидная ошибка, как "ошибка на единицу"(например в циклах) приводит к системному segfault; и бррр, указатели и арифметика указателей. нахер не нужно.
            Ответить
            • если в слове "хлеб" сделать 4 ошибки, то получится "пиво"

              посоны, не обращайтесь к недопустимым адресам, у меня от этого брат умер
              Ответить
              • но все же, лучше получить стектрейс ошибки с внятным описаловом, нежели малопонятное "ошибка номер 0хХУЙ по адресу 0хДЖИГУРДА"
                Ответить
                • кэп подсказывает, что чтобы его получить, достаточно воспроизвести ошибочную ситуацию под дебаггером, раз уж так получилось, что программист не может с первого раза посчитать границы массива

                  а клиенту обычно этот стектрейс столь же интересен, как и "по адресу 0xДЖИГУРДА"
                  Ответить
                  • тот же дьявольский кэп шепчет, что стектрейс во много информативней, а дебаггером не все ситуации отловишь...

                    сколько раз случалась ситуация "локально(на тесте) все работает, а в продакшене (у клиента) - ошибка". и ищи ее как хочешь, у клиента же дебаггер не запустишь.
                    Ответить
                    • зачем ты мне это рассказываешь
                      я 7+ лет отработал в том месте, где код писался на с/с++ без возможности удаленных отладок и прочих прелестей жизни для систем 24/7/365. Если бы в продакшене всё падало хотя бы раз в месяц, или хотя бы раз в квартал, ещё можно было бы поверить в твои сказки.

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

                      не осилил посчитать границы массива? лезешь в сырые указатели, не понимая что с ними делать? - продолжай резать антрекот деревянной ложкой
                      Ответить
                      • примитивно выражаясь - я не понимаю, зачем оперировать столь низкоуровневыми операциями, манипулируя звездочками и стрелочками там, где можно вполне обойтись точками.
                        вот RAII - это да, это уменьшает утечки по сравнению с GC

                        з.ы. мне нравится компромисс, который был достигнут в DMD D
                        Ответить
                        • звездочки и стрелочки - этому наследию уже 40+ лет
                          ну а в с++ они аналогичным образом используются в виде перегруженных операций класса
                          например, в итераторе, ну или какой-нибудь smart ptr

                          но в жабе даже перегрузка оператора уже "слишком сложно" чтобы этим пользоваться, и поэтому "ненужно"
                          Ответить
                          • жаба ведет себя как девственница - "это хорошо, но это неправильно - потому откажу себе в удовольствии!"
                            Ответить
                        • Страуструп смотрит с недоумением и рекомендует STL.

                          Если бы D не был таким сырым.
                          Ответить
                          • Страуструп на D даже не посмотрел. Его не интересуют такие поделки. Иначе он хоть отзыв бы на эту тему написал.
                            Ответить
                            • Это отдельные фразы, для этого я между ними строку пустую вставил.
                              Ответить
                            • наверное, он об этой поделке и не знает. слишком уж вяло и мало сообщество. хотя и странно это - ведь на D гораздо проще писать нативные приложения
                              Ответить
                      • >>И факт в том, что отлаженный на с++ код работает в 10 раз быстрее жабьего, потребляя в 10 раз меньше системных ресурсов

                        Это никакой не факт, а голословное преувеличение.
                        Разве что так было 7+ лет назад.

                        >>отлаженный на с++ код
                        Или речь о коде отлаженном дебагером сделаном на C++?
                        Ответить
                        • сейчас соотношение составляет х1.1
                          Ответить
                          • Максимум 2-3 раза. Если не особо морочиться с настройками VM.

                            Плюс в жабе сборка мусора в отдельном потоке - то есть даже однопоточное приложение безо всяких усилий будет работать в несколько потоков.
                            Ответить
                            • > даже однопоточное приложение безо всяких усилий будет работать в несколько потоков.
                              Точнее наоборот - даже многопоточное приложение будет упираться в скорость гц работающего в одном потоке.
                              Ответить
                              • ну, если постоянно создавать и уничтожать огромные структуры - то да. но обычно это указывает на неправильное кодонаписание.
                                много где освещается вопрос, как правильно писать приложение, чтобы упростить жизнь мусорщику - например, повторное использование.
                                Ответить
                              • >>будет упираться в скорость гц работающего в одном потоке.
                                Ты наркоман или просто питонист?

                                -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
                                Ответить
                          • то-то я смотрю, что jboss нужно 16Гб оперативы, чтобы обработать 1к подключенных соединений http long-polling

                            а простейшему жабьему клиенту, открывающему соединение с БД, перерабатывающему 500кб данных раз в 5 минут и засылающему переработанное на SOAP - полгига

                            давайте про производительность жабы и её коэффициенте 1.1 в другом месте поговорим
                            Ответить
                            • >> что jboss нужно 16Гб оперативы, чтобы обработать 1к подключенных соединений http long-polling
                              >>jboss нужно
                              Это фатальный недостаток языка Java.

                              Я боюсь говорить сколько нужно ресурсов программам типа Adobe Photoshop написанных на С++.

                              1.1x другая крайность, как и 10х.
                              Ответить
                              • >> jboss - фатальный недостаток
                                это всё к вопросу о необходимости стек-трейсов

                                клиент реально тупой как валенок, запущен в виде службы, работает безотказно уже месяцами
                                sql, List, Timer, TimerTask, ws, log4j да сгенеренные классы по wsdl

                                там, где java -server съела полгига, на с++ вышло бы целый мегабайт или даже три!
                                зато мышкой всё запрограммировалось за считанный час, это спасибо, думать над указателями не пришлось, а то вдруг ошибся бы на единицу
                                Ответить
                                • >>а то вдруг ошибся бы на единицу

                                  В жабе ошибаться на единицу чревато, равно как и в любом языке. Неправильный говнокод работающий месяцами, который не упадет сразу сегфолтом/исключением. Не знаю что хуже.
                                  Ответить
                              • Если бы Фотошоп был написан на Java, ему бы не хватило int64 для адресации
                                Ответить
                                • фотошоп, судя по всему, написан на жабе, ибо при запуске резервирует под себя 80% памяти, несмотря на обьем, будь то 2Г, то 64...
                                  Ответить
                            • >что jboss нужно 16Гб оперативы, чтобы обработать 1к подключенных соединений http long-polling
                              Хочешь аналог nginx-а? Или нацепи снаружу nginx, или ищи асинхронные фреймверки.
                              Ответить
                              • мне то зачем жабий асинхронный фреймворк?
                                расскажи это жавоблядям, которые написали это решение
                                а нам доля поддерживать у заказчика
                                Ответить
                                • вполне нормальная практика разными сервами отдавать статику и динамику
                                  Ответить
                                  • идея вообще заебись
                                    только где в моих постах проскакивало хоть что-то про статику?

                                    на jboss лезет пара тысяч клиентов по comet (http long-polling), сервер каждому в течение минуты, получаса, часа, суток (насколько сдюжит - ибо т.к. в мире жабы всё пиздец как хуево с асинхронностью, то ынтырпрайз на деле означает 1 клиент = 1 тред на сервере) шлёт онлайн-данные мелкими порциями с непредсказуемыми интервалами - типа таким образом приходят на клиенты "события" системы

                                    причем "события" фактически для каждого клиента индивидуальные - зависит от совокупности "каналов", на которые подписывается клиент

                                    я не могу это в корне поменять на сервере, потому что там closed source

                                    я могу лишь отмодернизировать клиенты (ибо там js) и написать на коленке свой сервер, например, на крестах, который с одной стороны будет выступать единственным клиентом для основного сервера на канале */*/* (т.е. жрать вообще все события, которые возможны), а с другой - раздавать тысячам модернизированных клиентов относящиеся к ним "события", только, например, по дуплексному веб-сокету (чтобы команды subscribe/unsubscribe не делать в виде отдельных http запросов)

                                    nginx тут вообще никаким раком

                                    именно об этой хуйне я и говорил на прошлой неделе
                                    про белых людей, async и тяжкой доле раба-крестушка, которому приходится убирать говно за высокоуровневыми господами
                                    Ответить
                          • Жаваблядское создание жрет память, не любит своп и долго "прогревается" ибо только православный мс догадался кешировать нативный код.
                            Ответить
                            • жрет сразу дофига памяти, чтобы не дожирать кусками потом
                              "прогревается" ибо компилит на лету только часто исполняемые куски кода, остальное интерпретирует

                              все это конфигуриемо на уровне виртмашины, но спецов по тюнингу жвм под конкретную бизнесаппликуху можно по пальцам пересчитать.
                              Ответить
                • Корки никто не отменял. Хоть они и могут весить тонну, а политика партии может не позволить их забирать на машину разраба...
                  Ответить
            • То, что в крестах есть арифметика указателей, не значит, что ее нужно пихать везде и всюду.
              Ответить
            • БАТТХЕРТ СЫРЫЕМАССИВЫБЛЯДИ СТАРАДАЙ И НАСЛАЖДАЙСЯ ЭТИМ
              Ответить
            • Каждый первый жабист считает, что умеет писать на пыхапе, а на деле 90 процентов ваших соплеменников не знают и половины возможностей последнего ;)
              Ответить
              • А на деле спрашиваешь на собеседовании "Что такое SPL? Какие классы в него входят? Зачем нужны phar-архивы?" у человека с 3 годами опыта пхп-разработки а он такой "wut? o_O"
                Ответить
                • У них небось 5.1 было.
                  Ответить
                • эээ... ну логика подсказывает что SPL - это Standart Php Library
                  Ответить
                • Кстати, phar это как jar или как war?
                  Ответить
                • и чего я пхписта не собеседовался... ))
                  Ответить
                • Это тоже правда. PHP развивается достаточно бурно, но вордпресс все еще остается самым популярным куском говна кода на нем.

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

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