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

    +159

    1. 1
    2. 2
    3. 3
    static function beforeIblockElementAddOrUpdateResetResponseAuthor($fields){
        ...
    }

    Запостил: n1ce22rus, 21 Ноября 2014

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

    • Зато не
      static function peredTemKakYaBlokiruyuElementDobavitIliObnovitSbrositOtvetAvtora($polya){
          //...
      }
      Ответить
    • Вангую статикоблядство. Когда долбоёб начинает вместо функций клепать кучу говноклассов со статическими методами и при этом уверен, что использует ООП.
      Ответить
      • В общем да: нубы часто думают что если обернуть кусок кода в класс, то настанет ООП.
        А так как с ООП в PHP сообществе обычно не очень хорошо, то вот такие конструкции там и получаются.
        Ответить
    • Кстати, это запах кода (тм) классический, прямо по Фаулеру.
      Если ты не можешь назвать метод ОДНИМ глаголом, значит он делает БОЛЕЕ одной вещи, и вероятно должен быть отрефакторен.
      Ответить
      • Опять неразбирающиеся в теме господа лезут с вумными комментариями.
        Это колбек для события, префикс beforeIblockElementAddOrUpdate нужен для того, чтобы можно было быстро поиском по коду найти все колбеки для определенного типа. Я бы только подчеркивание добавил, чтобы отделить префикс от названия метода (ResetAuthor).
        Ответить
        • :)) а я думал что методы типа Button42_OnClick остались в VB, аннет -- цветут и пахнут в битриксе.
          Метод должен называться исходя из того, что он делает. А навешивать его можно на какое угодно событие. А искать нужно посредством IDE а не посрдеством "поиск по коду".
          Ответить
          • Это как же можно навесить метод, который предназначается для одного события, на другое событие? Вы точно не совершили опечатку?

            Про "искать посредством иде" оставьте байку для тех, кто держит код на локальной машине.
            Ответить
            • Где я сказал про "предназначение" метода?

              Название метода зависит от его действия, а не от того по какой причине его вызывают.
              Например, вот (извините что на пайтоне):
              class EventHandler:
                  def __init__(self):
                      super().__init__()
                      self.handlers = []
              
                  def fire(self):
                      for handler in self.handlers:
                          handler("cool")
              
              
              def print_to_stdout(text): # Я пишу в стдаут и потому я print_to_stdout  а не fire
                  print(text)
              
              
              handler = EventHandler()
              handler.handlers.append(print_to_stdout)
              handler.fire()


              >>оставьте байку для тех, кто держит код на локальной машине.
              штоаа?;)
              У Вас часть кода лежит удаленно и Вы ищите по нему "поиском по коду" причем так, что IDE не имеет туда доступа?? Типа зашли по FTP фаром и нажали F4?
              Ответить
              • рефакторинг с помощью grep же
                если пхп-программист не способен руками подправить код на прод сервере, значит он не может называться проффесионалом
                Ответить
                • Причем править нужно грепом, на живом сервере, зайдя по SSH.
                  Ответить
                  • как это править грепом? sed на что?
                    Ответить
                  • > на живом сервере
                    Само собой. Причем периодически сохраняя недоперепиленный файл в редакторе.

                    > авком
                    Фу. Настоящий пыхер правит текстовым редактором.
                    Ответить
                    • MCEditом.

                      Но это не совсем настоящий. Совсем настоящий (как я уже говорил) идет по FTP тотал коммандером, жмет F4 и правит в блокноте
                      Ответить
                      • При этом он никогда не удаляет из файла старые куски, а аккуратно комментирует их или оборачивает в условия - ведь они когда-нибудь пригодятся.
                        Ответить
                        • Ну а как же иначе откатиться к старой версии?
                          Ответить
                          • Скопировать index.php в index.php.1 или index.php.vasya-2014-11-25, как вариант.
                            Ответить
                            • Лучше в index.1.php, чтобы можно было старую версию запустить тоже>
                              Ответить
                              • index.php.1 всё-таки лучше - он сделает проект опенсурсным.
                                Ответить
                                • Зависит от настроек mod_mime на самом деле)
                                  Ответить
                                • Зависит от проекта. Zend Framework, Yii, Symfony, например, предполагают, что все php-файлы, кроме точки входа, лежат за пределами htdocs, если только проект не размещён на шаред-хостинге.
                                  Ответить
                                  • Но настоящий пыхер поддерживает совместимость с шаред хостингами, PHP 4 и древней версией mysql (само собой через кошерный модуль mysql, а не mysqli или pdo), у которой еще не было проблем с кодировками. Само собой он не юзает какие-то там zend framework'и да симфонии.
                                    Ответить
                                    • > у которой еще не было проблем с кодировками

                                      Я что-то пропустил. О каких проблемах с кодировками речь?
                                      Ответить
                                      • > О каких проблемах с кодировками речь?
                                        Дефолтный swedish_ci же. А в старых мускулях, емнип, вообще кодировок не было (и, соответственно, проблем с ними).
                                        Ответить
                                        • collation это а не encoding) все же есть разница
                                          Ответить
                                          • Да там вроде бы и collation и encoding по-умолчанию шведские. Я не помню полностью строку, написал как вспомнилось. Давно это было...
                                            Ответить
                                        • А DEFAULT CHARSET=utf8 в выражении CREATE TABLE и SET NAMES utf8 после подключения к БД не помогают?
                                          Ответить
                                          • > после подключения к БД
                                            Если таблички запилили до этого - уже нет. Помогала только полная выгрузка, пересоздание и перезаливка. И то какие-то грабли были, емнип.
                                            Ответить
                                  • Ну тогда они и не index.php называются)

                                    Но Вы же помните статью Расмуса: фреймоврки нинужны.
                                    Ответить
                                    • Но ведь даже если писать по скелету из той статьи, можно разнести статику и код по разным директориям. Ах, да, так сделает только ненастоящий пыхер.
                                      Ответить
                                      • Ну тут была дискуссия с одним крупным специалистом по битриксу, который считает что одна точка входа это не всегда хорошо, и возможность подложить файлик типа "katalog_tovarov.php" прямо в htdocs это приимущество PHP.
                                        Ответить
                                        • А, ну этому мнению можно доверять. Битрикс же проффиссианальная CMS, не то, что любительский код на бесплатных симфониях.
                                          Ответить
                                          • Ознакомьтесь со структурой, кстати:
                                            http://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2287
                                            Ответить
                                            • Ну так всё нормально же! И статику можно отделить, и на каждый товар не нужно создавать вручную страницу вида /catalog/1029.html, и даже можно работать без обращения к БД.
                                              Ответить
                                              • ага) и подложить любой .php файлик куда угодно можно)

                                                На самом деле хранить статику в файловой системе это и правда хорошо, потому что во-первых ее нгинкс отдает, во-вторых ее удобно в git, в третьих удобно редактировать.
                                                Ответить
                      • А если кто-то идёт по SSH ФАРом, жмёт F4 и правит во встроенном редакторе ФАРа, то он ненастоящий пыхер?
                        Ответить
                        • > ФАР
                          Нет. Консолечка в срачло же. Настоящий пыхер никогда не опустится до использования консольных прог.
                          Ответить
                          • Но ведь сама пышечка является Ах, да, FastCGI или модуль Апача.
                            Ответить
                            • Да-да! Вот в CLI/CGI версии было нельзя сделать авторизацию по 401 :)

                              Кста, у пыха было два бинарника (не считая модуля под апач): CLI и CGI. CGI писал заголовки и X-Powerd-by, а CLI -- нет.
                              Ответить
                          • >>консольных прог.
                            досовых! Любую псведографическую программу называй "досовой", причем на никсах тоже.
                            Ответить
                        • Это более старый пыховец, из начала 2000х потому что любит фар и знает про WinSCP:)
                          Ответить
                  • У вас проблемы с ssh, не умеете пользоваться?)
                    Ответить
                • Судя по всему, вы как раз таким занимаетесь постоянно. Удачи вам в правках на боевом сервере.
                  Ответить
              • Сначала про код и иде.

                В битриксе около 15 тысяч файлов.
                Рабочее окружение проекта на битриксе, dev-копии, если по-хорошему, должно быть идентично окружению на продакшн-версии. Версия lamp, примочки, крон и прочее.
                Вести разработку на локальной машине в этом случае неэффективно (потери времени на настройку окружения). Пробовали вариант создания дампов виртуальных машин, но отказались - в этом случае каждому разработчику требовался суперкомпьютер.

                По этой причине, в особенности если в группе присутствуют удаленные разработчики, применяется группа dev-серверов, у каждого разработчика своя домашняя директория со своим клоном проекта. И да, к сожалению, sshfs пока не настолько крут, чтобы дать возможность ide делать поиск по коду или intelisense. Поэтому поиск по старинке, через git grep например.

                Из этого вытекает и мое замечания по поводу названия метода. Предположим, я назвал, как это полагается, метод ResetResponseAuthor. И, как вы предлагаете мне найти все обработчики события в таком случае?
                Это уже относится больше к соглашению разработчиков по именованию методов. Можно делать так, как показано в примере, можно вынести все обработчики в отдельный класс Events, можно еще что-нибудь придумать.

                Я вижу такие названия постоянно, получая на поддержку чужие проекты, и прекрасно понимаю логику тех, кто так поступает. Если вас такая логика не устраивает - это не повод считать ее говнокодом.
                Ответить
                • use docker:)
                  Ответить
                  • Что за утилита?
                    Ответить

                    • https://en.wikipedia.org/wiki/Docker_(software)
                      .

                      Докер это виртуализация посредством API ядра Linux. Она позволяет создавать конфигурацию и разворачивать её на любой линукс машине довольно быстро и легко. Не нужны ни суперкомпьюетры ни виртуалки.
                      Ответить
                      • > Не нужны ни суперкомпьюетры ни виртуалки.
                        Но нужен линукс на хосте.
                        Ответить
                        • Товарищ пишет:
                          >>. Версия lamp, примочки, крон и прочее
                          Это намекает на то, что они пишут не кросс-платформенный код)
                          Ответить
                          • Но ведь они могут работать на виндовых машинах. Ведь при правке через ssh совершенно пофигу, что стоит на машине разраба.
                            Ответить
                            • Оспаде, вот жеж звезды-то сошлись:
                              1) проект сильно завязан на лялих (крон там, то-сё)
                              2) разрабы под виндой
                              3) компы у них слабые, виртуалку не запустить
                              4) девсервер стоит так далеко что подрубица по smbfs/cifs итд нельзя

                              Блин, ну php код-то у себя можно держать? Ну поставить заглушку вместо крона?
                              Ответить
                              • Зачем заглушку? Use nncron, Luke!
                                Ответить
                                • > Зачем заглушку
                                  Затем, что правка кода, который в любой момент может вызвать крон, попахивает извращением... А потом еще и ждать, пока крон вызовет скрипт... Зачем всё это, если можно тупо пнуть скрипт самому?
                                  Ответить
                                  • А ведь действительно можно. Если проект не завязан на запуск php из чёрного экрана, то скрипт можно пнуть из браузера. И даже не придётся видеть ко-ко-ко-консолечку.
                                    Ответить
                                    • > скрипт можно пнуть из браузера
                                      Also you can write dual-mode script that takes options from command line and from request variables.

                                      For example:
                                      recheck.php --operation 100
                                      recheck.php --all
                                      recheck.php?operation=100
                                      recheck.php?all
                                      Ответить
                                    • >>чёрного экрана
                                      я вот тут распинался что консолечку надо называть "дос", но называть ее "черный икран" куда круче.

                                      А пинать скрипт это по-нашему) На одном сайте каждый 20й запрос отправлял одно письмо по рассылке. Так была реализована рассылка с задержкой без крона: у каждого 20го пользователя лишь чуть чуть тормозило, зато все работало
                                      Ответить
                                      • А можно сделать и без тормозов: после отрисовки страницы вызвать fastcgi_finish_request() и уже после этого отправлять письмо. Тогда клиент получит страницу без задержки и даже не заподозрит, что скрипт не завершил работу, а творит чёрные дела.

                                        Правда, я не уверен, что эта штука будет работать, если окружение отлично от FastCGI.
                                        Ответить
                                        • > Тогда клиент получит страницу без задержки
                                          Зато этот инстанс FastCGI будет занят, и на какое-то время перестанет отвечать на запросы?
                                          Ответить
                                          • Кто-то же должен исполнить этот оставшийся код! Но можно перенести код отправки почты в отдельный скрипт (хотя бы в php-скрипт, предназначенный не для сервера, а для чОрного икрана) и запустить его через popen.
                                            Ответить
                                            • > Кто-то же должен исполнить этот оставшийся код
                                              По-хорошему - отдельный воркер со spooler'ом.

                                              popen слишком неконтролируемый и немасштабируемый.
                                              Ответить
                                              • > По-хорошему - отдельный воркер со spooler'ом.

                                                Мне кажется, большинству должно хватать Gearman.

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

                          На маке тоже работает (приносит свой рантайм для эмуляции). Мелкософт озадачен, обещали на винде такое тоже запилить, чтобы прям в ней контейнеры запускать.
                          Ответить
                • Ну ё-моё... А держать клон проекта у себя на локальной машине (имеем ide и прочие плюшки) и деплоить его через тот же git на dev сервер что мешает?

                  P.S. Другое дело, что пыха довольно динамична, и IDE может не справиться с поиском.
                  Ответить
                  • Если давать тайп хинты посредством доков и сигнатур функций то PHPStorm справится с довольно большой частью этой задачи.
                    Ответить
                  • Эмм, а как вести собственно разработку, как тестировать? Или пишем код вслепую, деплоим на dev и там проверяем? Сам понимаешь, это не вариант.

                    Я перепробовал почти все ide под php, какие нашел, последний раз тестировал sublime, phpDesigner, phpStorm как раз, и eclipse. На машинке с 4 гигами памяти, проц i3, где-то год назад тестировал. Ждать по несколько минут, пока найдет искомое - это несерьезно, потери времени. Единственный, кто более менее справился с задачей - sublime, но это наполовину ide. Лучший вариант - искать через git grep, а это, сам понимаешь, другой метод. Intellisense кстати приходится отключать, иначе проект загружается по пять минут, а когда между задачами и проектами прыгаешь, это тоже ощутимые потери времени. Также приходится отключать и автокомплит, иначе банально построение индекса для автокомплита может повесить систему. На ubunte чуток меньше вешает, но все равно вешает.

                    Так что воркэраунд, применимый для разработки проектов на одном фреймворке, может быть неприменим на другом. Только и всего. И это приводит к тому, что приходится идти на соглашения между разработчиками, в именах методов в частности.
                    Ответить
                    • > Или пишем код вслепую, деплоим на dev и там проверяем?
                      Ну а как еще? "Правим строчку, проверяем, правим строчку проверяем, заебись, заработало, коммитим патчсет из 100500 строк" что-ли?
                      Ответить
                      • В моем случае, когда моя копия развернута на удаленном dev-сервер, я правлю строчку в sublime, в котором открыт проект, доступный по sshfs. И сразу же проверяю эту строчку зайдя по barbarbar.project.firma.ru.
                        И мне пофиг, откуда я это делаю, я могу это делать из дома с винды, могу из офиса с убунты, могу с пляжа через планшет. Я не привязан к конкретной машине, рабочее окружение создается один раз на сервере для всех разработчиков.

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

                        Более того, ваш вариант я в начале своего пути кодера как раз и использовал (денвер и т.п.). Сейчас пришел к пониманию, что в команде такой вариант невыгоден.
                        Ответить
                        • А мерджитесь вы как?
                          Ну вот Вы git pull, к Вам приехало 10005000 новых файлов, они срзу же отправились на сервер?
                          Ответить
                          • Я самым обычным способом использую git, и merge, и pull, и push. git установлен на dev-сервере, я просто логинюсь на dev-сервер в консоли и там провожу все манипуляции. А на локальную машину всего лишь монтирую папку с проектом с dev-сервера из моей домашней директории, чтобы ide могла с файлами работать.

                            Моя локальная машина лишь тонкий клиент получается, для работы вполне хватает старенького eee pc, если в дороге например или на отдыхе)
                            Ответить
                • суровые профессиональные будни
                  некогда разворачивать среду
                  правь код на серваке по ssh
                  Ответить
                • > суперкомпьютер
                  Комп с 4-8 гигами памяти - суперкомпьютер?
                  Ответить
                  • Выше писал, 4 гига не хватает, и дело даже наверное не в гигах, а скорости работы. Нужна шустрая оперативка, скоростной жд. Вобщем, в идеале, наверное какой-нибудь мак. Будем каждому кодеру выдавать мак для работы?)) Я за энтерпрайз, но не до такой же степени:)
                    Ответить
                    • выдали каждому кодеру i5 с ssd и 16гб рам, не мак
                      что мы сделали не так?

                      разочарован в битриксе
                      я-то думал, что всё, что пахнет 1с, уж как-нибудь позволяет потратить пару десятков тысяч рублей на основное средство производства с амортизацией 3 года
                      Ответить
                      • Рад за вас, сам мечтаю о подобной рабочей машине)

                        Но если серьезно, то выше http://govnokod.ru/17147#comment256907 написал причину отказа от хранения кода локально и переходу к идеологии "тонких клиентов" для группы разработчиков. Повышается мобильность, меньше затрат ресурсов. Но и конечно проявляется минус, в частности в том, что sshfs или любой другой способ монтирования удаленных директорий накладывает свои ограничения на использование intellisense и автокомплита при большом кол-ве файлов в проекте.
                        Ответить
                        • Наличие гита так же помогает мобильности клиентов.

                          Я могу сделать git pull прямо на пляже и там же поправить строчку и запустить проект даже если до близжайшего сервера мне три дня дайлапом
                          ----
                          Вы мечтаете об i5?
                          Ответить
                          • На пляже отдыхать надо, а не работу доделывать...

                            P.S. Быть незаменимым хотя бы в одной области - очень и очень хуёво. На своей жопе испытал.
                            Ответить
                            • Я просто процитировал товарища с его фразой про удаленную работу)

                              Сам-то я на пляж не хожу, нечего мне там делать.
                              Ответить
                          • Нет, i5 у меня дома, но я бы не сказал, что 17 дюймовый ноут это мобильный компьютер))

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

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

                          один может зайти и всё удалить к чертям, ну или не удалить, сломать

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

                          почему в php+битрикс такая жопа...
                          Ответить
                          • > разработчики правят одну копию кода
                            Не сгущай краски, Ди. У каждого разработчика своя домашняя директория со своим клоном проекта.
                            Ответить
                          • Вы как-то странно трактуете понятие тонкий клиент. Тонкий клиент всего лишь несильная рабочая машина, а уж какой процесс разработки в фирме - это другой вопрос. Я работал в разных, видел и то, что вы описали (банально не использовался контроль версий), и более приличные варианты.

                            Поэтому ваш вывод о жопе в битриксе и пхп основан на некорректной догадке. У меня почему-то именно в плане тонких клиентов жопа не наблюдается. Там есть жопы в другом, но это тема для другого разговора.
                            Ответить
                            • Ну то что битрикс и пхп это жопа факт. Хотя ваши заморозки тут нипричем
                              Ответить
                • Когда я впервые столкнулся с битриксом, меня жутко бесило, что код разработчика перемешивается с кодом в фреймворка. Обновляется битрикс - нужно апдейтить кучу кода в репозитории. И не дай бог кого-то угораздило слазить в код битрикса и поправить там что-нибудь - здавствуйте конфликты на обновлении.

                  Практически нигде больше такой ерунды не наблюдается. Во всех нормальных средах бинарники/исходники фреймворка чётко отделены от бинарников/исходников проекта.

                  Возможно, я просто что-то не осилил, но такая практика повергает меня в шок.
                  Ответить
                  • До 14 версии так и было, сейчас ввели директорию local, в которой можно держать код разработчика, не вклиниваясь в директорию bitrix.

                    У них большая проблема из-за политики обратной совместимости, но это бизнес, они не могут так спокойно отказаться от своих обязательств перед клиентами. За это, кстати, им большой плюс. В отличие от того же php, где с каждой новой версией на обратную совместимость забивают все больше.
                    Ответить
                    • Ну то есть к 14 версии битрикс понял то , что люди знали 25 лет. До пхп все так доходит. Удивительно что они про гит знают
                      Ответить
    • Новый метод обфускации - километровые имена классов, переменных, функций.
      Ответить
    • Он вышел во двор. Недалеко стоял мангал. Он подтащил его к Даниному окну и стал доставать свою старую одежду, которую захватил с собой, и, прокладывая её газетами складывать в мангал, затем всё это поджёг. Дым ел глаза, но Он не торопился, давая Дане остыть, зная, что тот за ним наблюдает. Потом Он залил недогоревшую одежду водой, сложил её в мешок для мусора, отнёс мангал на место и стал подниматься к себе. Возле своей комнаты стоял заплаканный Даня. Он рванулся к нему и, не сумев сдержать чувств, обнял Даню:
      Ответить

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