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

    +160

    1. 1
    ($isLead) ? $customerBalance = 0 : $customerBalance = $customerMapper->calculateBalance($customer);

    Код от мастера Йода

    Запостил: andr435, 05 Августа 2014

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

    • А вот Perl бы проучил засранца: http://ideone.com/GJj8h3
      Ответить
      • А что случилось? Perl не знаю, но выглядит логично.
        (Или PHP недостаточно знаю, может в PHP этот код творит нелогичные непотребства.)
        Ответить
        • 0 в перле - тру
          Как и в руби впрочем
          Ответить
          • А, 0 - false. Понял.
            Elvenfighter выбрал неудачное число для примера (или удачное для выявления перлонубов).
            Ответить
            • даже я запутался.
              В перле и правда 0 - false. а я думал как в руби.
              Ответить
              • 0 -- это false в перле. И теперь лёгким движением руки:
                - my $isLead = 0;
                + my $isLead = 1;

                этот кусок хм... кода превращается... превращается в http://ideone.com/N8ox5H WAIT, OH SHI~
                Ответить
              • 0, undef, пустая строка -- false
                пусой массив -- тоже false, так как в скалярном контексте возвращает свою длинну (0)
                пустой хеш -- тоже false, так как в скалярном контексте тоже возвращает 0.

                Всё остальное -- true. Т.е. любой другой скаляр (кроме специально запрограммированного) и непустой массив/хеш -- это true.
                Ответить
                • так почему $isLead = 1; он все равно идет по ложной ветке?
                  Ответить
                  • Идёт как раз по нужной ветке. Введём две переменные и убедимся:
                    ($isLead) ? $customerBalance1 = 0 : $customerBalance2 = $customerMapper->calculateBalance($customer);
                    Ответить
                    • тогда у меня один вопрос - WHY?!!!!
                      Ответить
                      • Подсказка: ветки имеют совсем не ту длину, которую ожидает сишник.
                        Ответить
                • А как же строка, состоящая из одного нолика?
                  Ответить
                  • то ли дело в руби - false да nil - остальное труъ
                    Ответить
                    • Да ничего хорошего. Приходится из-за такого строгого разделения использовать дополнительные операторы, универсальность теряется.
                      Где можно было написать if(str), приходится писать if(!isNullOrEmpty(str)).
                      Где можно было написать if(x), приходится if(x == 0).
                      Становится длинно, надо много писать и читать.
                      Ответить
                      • Зато логика железобетонная. и если должен быть уверен, что обьект не null тебе придется проверять на что именно false - на null или на 0 или на "0". в руби сомнений нет
                        Ответить
                        • Да, особенно в динамическом языке. Проверить на тип, проверить на null, проверить на пустоту для данного типа. Проверить проверку проверки.
                          А ведь часто достаточно проверить сначала на пустоту, а затем уже интересоваться, какой там тип.
                          if(!x) return; // x не установлен!
                          if(isString(x)) return 'hello ' + x;
                          return 'Plohoe value!!!111';

                          Если же тип известен, нет нужды явно прописывать.
                          if(evilListLength) // evilListLength, очевидно, целое число
                          Ответить
                          • !x выдаст тру на х = "0"
                            Ответить
                            • В PHP выдаст, но у нас же не только один идеальный PHP, вокруг которого крутятся все планеты!
                              В C/C++ это будет аналог isNull, в JS - isNullOrEmpty. А !"0" будет false, никаких беспорядков.
                              Ответить
                              • import Data.Maybe (isJust)
                                                  
                                class Boolable a where
                                    true :: a -> Bool
                                
                                instance Boolable Bool where
                                    true = id
                                
                                instance Boolable Int where
                                    true = (/=) 0
                                
                                instance Boolable Integer where
                                    true = (/=) 0
                                   
                                instance Boolable [a] where
                                    true = not . null
                                          
                                instance Boolable (Maybe a) where
                                    true = isJust
                                          
                                main :: IO ()
                                main = print
                                  [ true True
                                  , true False
                                  , true (1 :: Integer)
                                  , true (0 :: Int)
                                  , true "lol"
                                  , true ""
                                  , true $ Just 5
                                  , true Nothing
                                  ]


                                > C++
                                operator bool() const
                                Ответить
                                • и причем тут хаски?)
                                  Ответить
                                  • забавные у вас проблемки в забавных язычках
                                    Ответить
                                    • Какие проблемы, нет проблем.

                                      Имя функции некошерное. toBool было бы лучше. Имхо.
                                      Ответить
                                      • А если бы назвали "bool", можно было бы писать "(bool) 3".
                                        Ответить
                                        • зачем скобки? Типа сишкапародия?
                                          Ответить
                                          • Конечно. Сишка - сила.
                                            Ответить
                                            • Тебя царь покусал?
                                              Ответить
                                              • Нет, просто уж очень красиво сделано. Скобочки, значочки, ...
                                                Ответить
                                                • В чём красота? Чтобы вопсользоваться результатом каста в общем случае нужны ещё одни скобки:
                                                  ((T) x)->callMe();
                                                  неудобно же
                                                  Ответить
                                                  • Красота общая :) Если не всматриваться в подобные досадные детали (да, их может быть бесконечно много, но всё проходит мимо влюблённых глаз поклонника сишки).
                                                    Ну, у (type) достаточно высокий приоритет, чтобы не всегда были лишних скобки. А если учесть, что в других языках могут потребовать писать if(toBool(x)) вместо if(x), то не так обидно.
                                                    Ответить
                                                    • мне кажется нет ничего красивее функции. разве что функция высшего порядка
                                                      Ответить
                                                      • Внутренняя красота функции-в-себе? Мне даже стыдно стало после этого, что я материалист такой и любитель скобочек.
                                                        Ответить
                              • я конкретно про перл говорил
                                Ответить
                                • А я про !x в целом и возможность выбрать годные умолчания.
                                  А с вышеупомянутым operator bool из C++ и valueOf из JS можно пилить свои !x со своими удобными правилами.
                                  P.S. Хотя, нет. В JS придётся !+x, чтобы valueOf сработал.
                                  Ответить
                                  • Да так везде можно. Ввел свою функцию или класс с функцией как машинариум и радуйся. Я о том. что мне больше нравиться дефолт в руби .
                                    Ответить
                  • Да в перле "все строка" по этому не стал это упоминать. Ведь тогда придётся объяснять "0E0" и "0 but true".
                    Ответить
                    • В пёрле все-таки касты повменяемей, чем в пыхе. Там же == и eq - разные операторы, поэтому всё предсказуемо.
                      Ответить
    • Народ что с вами?
      Код написн правильно, просто по человечески было бы написать:

      $customerBalance = ($isLead) ? 0 : $customerMapper->calculateBalance($customer);
      Ответить
      • > Народ что с вами?
        Тут всегда так.
        Ответить
      • А что ты хотел от сайта, где маскот - каког багог?
        Ответить
        • А, точно, извините забылся
          Ответить
          • Будь внимателен!
            Ответить
            • ага, будь внимателен, чтобы ни капли мимо не пролетело. Все в рот, в рот!..
              p.s.
              Въебал минус за быдлоганство.
              Ответить
    • Красным минусы горят - это Путин виноват
      Въебал всем по минусу.
      Ответить

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