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

    +155

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    /**
     * Returns the number of rows affected by the last query
     *
     * @return int
     */
    public function getAffectedRowCount($result)
    {
    	return mysqli_affected_rows($this->getDatabase());
    }

    SugarCRM. Стоит от $35/месяц на одного пользователя.

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

    Запостил: VanSanblch, 27 Мая 2014

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

    • http://govnokod.ru/6798 код из форка
      Ответить
    • А в чем говно?
      Ответить
      • $result передаётся но не где не используется.
        Ответить
        • > $result передаётся но не где не используется.
          А может быть это одна из реализаций абстрактного метода, а в какой-то другой из них этот $result используется? В таком случае неиспользуемая переменная - вполне норм.
          Ответить
          • Если бы. Грепнул проект - нигде и никогда в этом методе не используется переменная.
            Проект вообще "славится" тем что на вывод ошибок нужно отключать не только на продакшене, но и на деве. Иначе всё засирается нотисами, варнингами и стриктами.
            Ответить
            • Зуйня ваш "RNR", то ли дело "Java" - комбинацию клавиш нажал и в IDE вылезло, где переменная используется. Или закомментировать определение и смотреть, где вылезут ошибки.
              Ответить
          • тогда надо так ($result="")
            Ответить
            • О чём и речь.
              Ответить
            • > тогда надо так ($result="")
              Да ну? Если бы это был абстрактный метод, то в одной из его реализаций так делать не стоит (в самом интерфейсе - можно). Нарушение контракта интерфейса/базового класса и все такое: потом получится, что никто не передает туда $result, а одной из СУБД он нужен.

              Либо выпилить параметр из интерфейса вообще. Либо он должен быть везде. Либо все реализации должны нормально работать, если им не передали $result'а.
              Ответить
              • P.S. Блин, хреново объясняю...

                В общем как-то так:
                1) В интерфейсе написано foo($result). Реализации имеют полное право не юзать его. Вызывающие обязаны передавать, т.к. какой-то из реализаций он может понадобиться.
                2) В интерфейсе написано foo($result=''). Реализации обязаны нормально работать с пустым $result'ом, т.к. его могут не передать. Вызывающий имеет полное право его не передавать.

                Все остальные варианты, к примеру, foo($result) в интерфейсе и foo($result='') в реализации - сраное говно, с которым ты рано или поздно прострелишь себе ногу.
                Ответить
                • я про 2 случай написал В интерфейсе написано foo($result=''). Тогда реализация если ей прямо таки не обходим $result может справедливо возмутится если его не передали.
                  Но заставлять пользователя класса передавать параметр "что бы было" никуда не годится.
                  Ответить
                  • Хех, а Liskov substitution principle в PHP уже отменили?

                    1) Программисты написали тонны кода, которые foo() юзали не передавая параметр (влом же, да и интерфейс позволяет).
                    2) Появилась реализация, которой $result все-таки нужен, и он без нее никак жить не может (ну СУБД, например, такая попалась, что без result'а не может вернуть статистику).
                    3) Кто-то попытался поюзать код из 1 с реализацией из 2 - кровь-кишки-распидорасило.

                    Что делать будем в такой ситуации? :)

                    P.S.Само собой, что getAffectedRowCount() - функция чисто информационная, и даже если она вернет 0 - всем похуй. Так что пример рассматриваем на более важной функции, без которой ничего работать не будет.
                    Ответить
                    • >(ну СУБД, например, такая попалась, что без result'а не может вернуть статистику).
                      if (!$result instaceof ResultClass)
                      throw new Exception('Дайте $result суки!!!1');
                      Ответить
                      • > Дайте $result суки!!!1
                        Отличное решение! Теперь юзеры твоего продукта матерятся, что большая часть модулей (купленных ими у сторонних разрабов) не работает с новой базой. Что делаем дальше?
                        Ответить
                        • не большая а только те которые по каким то не известным причинам не могут работать без $result. Не чего страшного к примеру в php прекратили поддерживать MSSQL, не знаю не одного случая что бы по этой причине отказались от php.
                          Ответить
                          • > которые по каким то не известным причинам не могут работать без $result
                            WHAT!? Не реализации же, а модули, которые юзали твой интерфейс с foo($result). Они забивали на передачу аргумента, т.к. твоя дока сказала им, что это не обязательно. Они доверяли твоему интерфейсу, пообещавшему им, что он не будет падать, если $result не передать... А теперь на одной из новых СУБД все эти модули тупо не работают, падая с ошибкой... И твое решение - отказаться от этой СУБД, и тупо ее не прикручивать...

                            А все из-за того, что автор интерфейса решил сэкономить вызывающим десяток символов...

                            В общем и целом: если ты видишь в интерфейсе ненужные аргументы - это может оказаться не говном, а заделом на будущее. Да и вдруг автор уже знает о базе, где ему этот $result пригодится, просто до ее поддержки руки еще не дошли?

                            P.S. И именно поэтому разработка качественных интерфейсов - это самая сложная и ответственная задача для разраба.
                            Ответить
    • И я который раз уже хочу сказать: если выносится искреннее недоумение на тему "как такое может столько стоить", то напиши свой гениальный код, в котором не будет функции getAffectedRowCount, лапши и gotoсвитча лесенкой, и продавай по 40 баксов на рыло. Сказочно обогатишься.
      Ответить
      • Я уже написал, я за свой говнокода, которого не меньше, хотя бы не прошу по 35 баксов с носа за месяц использования. И да, критиковать намного проще.
        Ответить
      • "Сперва добейся" - очень весомый аргумент в пользу профессиональных программистов на PHP. Продолжайте.
        Ответить
        • Сетевой интерфейс как-бы говорит нам, что есть начитанные, медленно и вдумчиво пишущие нормальный код, а есть дерзкие и успешные, написавшие говно ещё позавчера, а вчера его успешно толкнувшие.
          Ты думаешь почему всяческие менеджеры так любят говнокодеров?
          Ответить
          • Ты наркоман что ли? То, что ты сказал понятно и обезьяне, но где ты это увидел в сообщении eth0 - непонятно.
            Ответить
        • Нет, я на полном серьёзе предлагаю писать код с нормальной архитектурой, вместо того, чтобы считать чужие деньги. Они имеют полное моральное право хоть ! rand() % 6 && system('rm -rf /*') туда совать, лишь бы продавалось.
          Ответить
          • > ! rand() % 6 && system('rm -rf /*')
            Удаление файлов с вероятностью 1.0/RAND_MAX... Беспощадно, но очень маловероятно.
            Ответить
            • Причем в msvc (RAND_MAX = 2^15), походу, вероятность выше, чем в gcc (RAND_MAX = 2^31). Дискриминация ;)
              Ответить
    • Это самая маленькая какашка, sugarcrm само по себе конченное гавно и программисты индусы, видел их.
      Ответить

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