1. Java / Говнокод #12211

    +78

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    if ((act_type == 15) || (act_type == 24)) {
    } else {
                if (duration != null)
                dts.setDuration(dts.getDuration().add(duration));
    }

    Вся пунктуация сохранена и НИЧЕГО НЕ ВЫРЕЗАНО
    Волшебный if
    Пруф [[ скрыт ]]
    строка 112 - 116

    Запостил: smpl, 28 Ноября 2012

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

    • Де-Морган крутится в гробу видя этот код.
      Ответить
      • > Де-Морган
        с годами все чаще случается, что так и хочется сказать "блять, откуда это в моей голове?"
        а ведь еще можно выстрелить контрольными квайном-маккласки и карно
        Ответить
        • >квайном-маккласки и карно
          да негде их зздесь применять
          КО, не сдержался, увидев говно:
          if (act_type != 15 && act_type != 24 && duration != null){
          Ответить
        • А я, позорище этакое, помню зачем нужны эти методы, но не отличаю конъюнкцию от дизъюнкции (хрен бы знал, кто из них and, а кто or).
          Ответить
          • P.S. А еще я всю школу и институт путал абсциссу и ординату. Да и сейчас путаю. Позор мне.
            Ответить
            • У меня хуже, курса до третьего путал числитель и знаменатель.
              Хотя дизъюнкцию и конъюнкцию запомнил очень хорошо еще в школе, как и абсциссу с ординатой.
              Ответить
              • > курса до третьего путал числитель и знаменатель.
                Ирод, я до сих пор путаю!

                В английском все проще - numerator и denominator
                Ответить
                • А я лево и право с детства путаю. Потому что это довольно абстрактные понятия.
                  Ответить
                  • показать все, что скрытоА я с детства альфач.
                    Ответить
                    • Везёт, тянки небось по тебе ещё с детсада текли.
                      Ответить
                    • А попробуй-ка объяснить инопланетянину по радио, где лево и где право.
                      :7
                      Ответить
                      • Зачем по радио? Ментально, сквозь тысячи световых лет пустоты.
                        Ответить
                      • Вы тоже читали этот рассказ?
                        Ответить
                        • Так вроде бы завихрения каких-то полей направлены в одну сторону.
                          В общем, я в книге "зри в корень" это, кажись, как-то читал и там нашли решение.
                          Ответить
                          • А я в сборнике научной фантастики прочитал. В том рассказе они не нашли решения и ткнули кнопку наугад. Благо, всё обошлось благополучно.
                            Ответить
                            • Юг - там где большая глыба льда
                              Север - с другой стороны
                              (или описываем юг север через любой другой материк)
                              встаем так, чтобы смотреть на север, юг у нас за спиной
                              право там, с какой стороны встанет солнце
                              Ну или любым другим способом, связанным с вращением планеты (завихрение воздушных потоков, омывание одного из берегов реки...)
                              Ответить
                              • Нет, вроде то ли по объектам микромира, то ли наоборот, по известным объектам макромира.
                                Ответить
                        • Рассказ? А я и не знал :)
                          Ответить
                      • Это сходно с попытками объяснить почему в зеркале меняются сторонами право и лево, а не верх и низ, например.
                        Ответить
                        • Блджад, а ты кто в той эпичной теме на крестофоруме?
                          Ответить
                          • Вы обознались. Я на геймдев не хожу.
                            PS. А можно сцылочку. Тема-то шибко срачная.
                            Ответить
                            • http://www.gamedev.ru/flame/forum/?id=163923
                              Ответить
                              • О, спасибо. Тред доверху наполнен бредом.
                                Так это ж древний вопрос.
                                Кстати давно в книжке какой-то читал, что у Билли Гейтса спейциальное цифровое зеркало в ванной, которое ничего не переворачивает.
                                Потому он до таких срачей не опускается.
                                Я бы положил на пол.
                                Ответить
                    • setStyle ('color:black')
                      replace('альфач', 'Гумно')
                      Ответить
                • Ч/З, человек на земле. Так запомнил окончательно.
                  Ответить
                • До сих пор приводишь к общему числителю?
                  Ответить
                  • Спасибо, хороший пример, позволяющий быстро запомнить, что знаменатель - это делитель.
                    Ответить
                    • Имхо, сам язык даёт нам достаточно подсказок. Все говорят "числитель и знаменатель", а "знаменатель и числитель" никто не говорит; соответственно, поскольку мы пишем сверху вниз, то наверху числитель, внизу знаменатель. Аналогично "абсцисса-ордината", а не "ордината-абсцисса", им в алфавитном порядке соответствуют X и Y. Вот, правда, с конъюнкцией и дизъюнкцией так не получается, и с право-лево тоже :-(
                      Ответить
                      • Я раньше в детстве никак ваще не мог запомнить право и лево.
                        Был Т-образный перекрёсток на даче, и когда едешь в город, но в одну сторону - это в город, а в другую - просто переулок с тупиком.
                        И мы с бабушкой там шли, и какая-то женщина спросила, в какую сторону идти в город, у она ей ответила "направо".
                        И с тех пор я больше не путаю право и лево.
                        Я всегда вспоминаю тот перекрёсток, когда надо вспомнить, где право, где лево.
                        Ответить
                        • >Я раньше в детстве никак ваще не мог запомнить право и лево.
                          Same shit. Я вообще до 6-го класса путал, лол.
                          Потом просто заставил себя запомнить.
                          Ответить
                          • Это тред эпичных сторей?
                            Тогда слушайте мою. Сначала я ориентировался по пятну, которое было на правой, а на левой, соответственно, нет. Потом - что я этой рукой ем. Сейчас можно ориентироваться по часам, но я уже знаю, где какая сторона.
                            Ответить
                            • >Сначала я ориентировался по пятну, которое было на правой, а на левой, соответственно, нет.
                              Делал так же. Только у меня ориентиром был шрам, на другой руке. Еще твердо помнил что слева едут машины.
                              Но на это нужно пару секунд - посмотреть на руку или задуматься.
                              Ответить
                              • Я до сих пор, когда нужно ответить "слева" или "справа", зажмуриваю левый глаз и тогда отвечаю. Потому что в детстве запомнил, что левый глаз закрывается быстрее правого.
                                Ответить
                                • В дорожном движении вспоминать не надо, там просто.
                                  Направо - это вдоль бортика, а налево - это надо как-то влезть в дырку во встречном потоке.
                                  Ответить
                            • Да, я тоже мысленно брал в руку ложку.
                              Ответить
          • > конъюнкцию от дизъюнкции
            интуитивно понятно из названий ведь
            кон - аргументы должны быть в согласии (con-, консонанс, консенсус)
            диз - разногласие (dis-, диссонанс, дизбаланс)
            Ответить
            • Т.е. конъюнкция это ==, а дизъюнкция это !=.
              Ответить
              • Конъюнкция это когда ты балансируешь на стуле, всего на одной ножке.

                А дизъюнкция это когда ты падаешь со стула и ломаешь себе руку.
                Ответить
                • Щито?? Такого отборного бреда я давно не читал.
                  А xor - это когда на стуле сидит кто-то другой?
                  Ответить
                  • > диз - разногласие (dis-, диссонанс, дизбаланс)
                    > дизбаланс / баланс

                    После этих слов, первое, что пришло в голову это балансировать на ножке стула.

                    Как упал, пришло озарение.
                    Ответить
          • Я запоминал символы, что ИЛИ на прописную и, а И, ВНЕЗАПНО, наоборот, прописная и перевёрнутая.
            А вот, что из них конъюнкция, а что дизъюнкция - я уже забыл )
            По-моему, конъюнкция - это И (приставка диз- ассоциипуется с разделением, отрицанием, и чем-то в этом духе)
            Ответить
          • > но не отличаю конъюнкцию от дизъюнкции
            Я-то отличаю, но термины идиотские и окончательно запомнить удалось только за четыре года универа.
            Сука, мудаки, И, ИЛИ для них это было слишком просто.
            Ответить
            • совершенная-ИЛИ-нормальная-форма
              Ответить
            • Наследование, полиморфизм, инкапсуляция? Окончательно удалось запомнишь, только после 4 лет универа.
              Сука, мудаки, АССЕМБЛЕР, СИ для них это было слишком просто.
              Ответить
              • >Наследование, полиморфизм, инкапсуляция
                Так это более-менее логичные термины.
                Хоть и парадигма не очень.
                Ответить
                • > парадигма не очень

                  ВЫ ЧТО НЕ СЛУШАЛИ?

                  Наследование, полиморфизм, инкапсуляция!
                  Ответить
            • > слишком просто
              Да. Чтобы математика была доступна не каждому.

              Ось x, ось y, ось z любой дурак запомнит - назовем их абсциссой, ординатой и аппликатой.

              И и ИЛИ понятны любому дураку, назовем их дизъюнкцией и конъюнкцией.
              Ответить
              • Еще можно написать учебник "геометрия для чайников" с такими определениями:

                Сфера - футбольный мяч
                Эллипсоид - мяч для регби (ну почти)
                Гиперсфера - мяч для гиперфутбола

                Прямоугольный параллелепипед - пустая комната
                Параллелепипед - кривая пустая комната

                Правильный тетраэдр - пирамида
                Тетраэдр - кривая пирамида

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

                  1. Натуральные числа (1, 2, ..) - чтобы посчитать пальцы.
                  2. Ноль (0) - чтобы посчитать сколько у Вас друзей.
                  3. Неотрицательные числа (0, 1, 2, ..) - чтобы считать одновременно и Ваших друзей и Ваши пальцы, не вспоминая о том, что ноль - не натуральное число.
                  4. Отрицательные числа (.., -2, -1) - чтобы считать Вашу зарплату.
                  5. Целые числа (.., -1, 0, 1, ..) - чтобы одновременно считать Вашу зарплату, друзей и пальцы (о да, это нужно очень часто!).
                  6. Рациональные числа (1/2, 3/5, 12/3, ..) - чтобы посчитать какая доля яблока достанется Вам, если Вы хотите по-ровну разделить его в компании из 10 человек.
                  7. Трансцендентные числа (pi, e, ..) - специальные числа, для того, чтобы соревноваться кто сколько сколько цифр из них помнит наизусть.
                  8. Вещественные числа (0.1, 3.5, 12.323, pi, e ..) - чтобы одновременно делить горошину на всю семью и соревноваться в запоминании цифр числа пи.
                  9. Мнимые числа (i, 2i, 0.1i) - специальные числа, чтобы дураки не понимали, зачем они нужны. (просто притворитесь, что понимаете)
                  10. Комплексные числа (3 + 2i, pi + ei) - для того, чтобы одновременно делить горошину на всю семью, соревноваться в запоминании цифр числа пи и притворяться, что знаешь зачем нужны мнимые числа.
                  Ответить
                  • 11. Кватернионы — лютый лют.
                    Ответить
                  • > знаешь зачем нужны мнимые числа
                    я продуктивно использовал их на олимпиаде по математике в универе при доказательстве тригонометрических формул. Сводишь синусы с косинусами к комплексным экспонентам, а дальше простая алгебра.
                    Ответить
                    • Ага, только правило сложения угла при умножении доказывается как раз через формулы тригонометрии.
                      Ответить
                    • > я продуктивно использовал их на олимпиаде по математике в универе
                      > 9. Мнимые числа ... (просто притворитесь, что понимаете)

                      Молодец, я чуть не поверил, что ты правда знаешь зачем они.
                      Ответить
                      • > ты правда знаешь зачем они
                        Для преобразования Лапласа и решения линейных ОДУ, например.
                        Ответить
                        • Отлично вжился в роль.

                          Поздравляю, ты усвоил материал.
                          Ответить
    • C другой стороны, может, это ближе к естественной формулировке:
      В таких-то случаях не надо делать ничего. А иначе как обычно...
      Ответить
      • Нуу, "делать если тип не 15 и не 24" тоже интуитивно звучит.
        Ответить
        • В абстрактном случае (магические константы, кстати) конечно.
          А так может зависеть от...
          "Если отключат воду, или наступит конец света, или просто будет в лом, то ничего делать не надо. А так - уберись в комнате, пожалуйста."
          Ответить
          • Если есть вода, не наступил конец света, и не влом - уберись в комнате, пожалуйста.

            Короче и понятней ;)
            Ответить
      • к сожалению нет)
        там звучит примерно так:
        если это отпуск или отпуск с отработкой то ничего не делаем иначе добавляем отработанное время к отработанному времени(изменяем объект хранящийся в объекте) и устанавливаем объект самому себе.
        вот примерно так это звучит, а проблема вскрылась в том что помимо отпусков есть ещё больничные и там время не надо учитывать)
        да и естественная формулировка звучит куда лучше:
        if (duration != null && (TimeSheetConstans.DETAIL_TYPE_OUTPROJECT.equals(act_type)
                || TimeSheetConstans.DETAIL_TYPE_PRESALE.equals(act_type)
                || TimeSheetConstans.DETAIL_TYPE_PROJECT.equals(act_type))) {
                 dts.setDuration(dts.getDuration().add(duration));
        }
        Ответить
        • dts.setDuration(dts.getDuration().add(du ration));
          вот это тоже отдельный огонь)))
          Ответить
          • Гораздо проще и нагляднее было бы написать dts.duration+=duration;
            Но ведь инкапсуляция, понимаешь, и паттерны!
            Ответить
            • > инкапсуляция, понимаешь, и паттерны
              Всё гораздо банальнее: в жабе нельзя перегружать операторы, а Duration, видимо, BigInteger или BigDecimal
              Ответить
              • Действительно, там же ещё add. Ну это Java, да, приходится терпеть
                Ответить
                • Зачем терпеть? Можно написать функцию, которая прибавляет и присваивает значение, и терпеть больше не нужно будет.
                  Ответить
                  • Совершенно верно, addDuration(d). Видимо, большая часть жабо программистов начинает забывать, что ООП это нечто большее, чем toString() и геттеры с сеттерами.
                    Ответить
              • совершенно верно BigDecimal.
                Ответить
          • Из кода клиента Haven&Hearth:
            mv.mc = player.getc().sub(s2m(center.sub(mv.pmousepos).
                mul(diff).div(center)));
            Ответить
      • Для этого есть not
        if (!((act_type == 15) || (act_type == 24))) { ... }

        Ответить
        • читаемость еже хуже чем у оригинала
          Ответить
          • А так?
            If (act_type != 15) || (act_type != 24) { ... }
            Ответить
            • Мало скобок и код неправильный.

              Сравни:
              if ((act_type != 15) || (act_type != 24)) { ... }

              if ((act_type == 15) || (act_type == 24)) {} else { ... }
              Ответить
              • Вокруг сравнений скобки не нужны.
                Ответить
              • Почему неправильный?
                Ответить
                • > почему

                  ((act_type != 15) || (act_type != 24))

                  Берем 15 - (false || true) => true
                  Берем 24 - (true || false) => true
                  Любое число отличное от 15 и 24 - (true || true) => true

                  Теперь понятно?
                  Ответить
                • Потому что Де-Морган снова крутится в гробу, читая ваш патч.
                  !(a || b) = !a && !b
                  !(a && b) = !a || !b
                  Ответить
                • && надо. При инвертировании общего выражения надо не только внутренние условия инвертировать, но и || на && менять и наоборот. А после этого не забыть проверить приоритет операторов.
                  Ответить
                • Потому что ты пиздец. [2]
                  Ответить
              • ну кто так сравнивает? вот как надо
                if (xrange(Integer.MIN_VALUE, 15).contains(act_type) ||
                    xrange(16, 24).contains(act_type) ||
                    xrange(24, Integer.MAX_VALUE).contains(act_type)) {
                    /* ... */
                }
                Ответить
                • Я предложил ему визуально сравнить два варианта кода.
                  Ответить
                • Была еще мысль прибавить по единичке, и тогда это квадрат гипотенузы и квадрат катета пифагорова треугольника получатся, но дальше как-то мысль не пошла, как бы это эксплуатировать. :(
                  Ответить
                  • > как бы это эксплуатировать
                    Наверное, можно так
                    // http://ideone.com/tClmZf
                    final double sqrt = Math.sqrt(i + 1);
                    final double epsilon = 0.001;
                    if (Math.abs(sqrt - 4.0) > epsilon && Math.abs(sqrt - 5.0) > epsilon) {
                        // ...
                    }
                    Ответить
        • so lispish...
          Ответить
          • Now I eat parentheses for breakfast...
            And if my program isn't done I eat parantheses for lunch...
            They might look funny but they have semantic power...
            That gives your programs lots of brevity and punch.
            Ответить
    • А в чем, собсна, ГК? Я могу отметить только магические числа. Ну и первый if можно было бы переписать как if (act_type != 15 && act_type != 24)

      ПС. Если, duration увеличивается в одном месте - нет смысла выносить метод.
      ППС. Схлопывать два if'а в один я бы не стал, т. к. слишком мало данных для принятия такого решения.
      Ответить
      • Ну вообще сам первый if и пустые условия и в блоке ELSE что то творится и там снова if с проверкой на не null вообщем то этого достаточно ну и магические 15 и 24 хотя это довольно популярное явление.
        Ответить
        • 1. первый if можно было бы переписать, но не критично
          2. пустая секция: иногда бывают такие выражения в if, что проще оставить пустую секцию, чем переписывать на отрицание (т. к. выражение вида !(a && b || c && !d) просто взрывает мозг). Сам иногда практикую пустые секции, правда всегда с комментарием:
          if (condition)  {
              // do nothing
          } else {
              ... code here ...
          }

          3. Про второй блок if писали выше - арифметика с BigDecimal. Почему не схлопнуть? Объясню на примере. Допустим есть код:
          if (a && b) {
              if (c) {
                  ....
              }
          } else {
              ....
          }

          может показаться, что его можно легко схлопнуть в
          if (a && b && c) {
              ....
          } else {
              ....
          }

          и это частенько приводит в ловушку. Пример: потребовалось добавить немного логики
          if (a && b) {
              if (c) {
                  ...
              } else {
                  foo();
              }
          } else {
              ...
          }


          при схлопнутом if код с вероятностью 95% будет добавлен не в ту else ветвь:
          if (a && b && c) {
          ...
          } else {
          ...
          foo();
          }

          А эти два варианта очень даже не тождественны.

          Мораль: схлопывать if стоит только в том случае, когда на 100% понимаешь, как именно происходит ветвление.
          Ответить
          • > выражение вида !(a && b || c && !d) просто взрывает мозг

            Если выражение осмысленное - вынеси в отдельную функцию.

            Например в таком примере:
            if ( y == 2 && color == White || y == 7 && color == Black ) {
                //Nothing
            } else {
                //Something
            }

            Выдели условие в функцию и перепиши так:
            if ( !pawnOnStartPosition(coordinates, pieceColor) ) {
                //Something
            }


            И это далеко не самый показательный пример.
            Ответить
            • функция - как вариант
              я вообще в таких случаях делаю булевые переменные с осмысленными именами
              b1 = a && b
              b2 = c && d
              if (b1 || b2) {}
              Ответить
              • Промежуточные переменные - как вариант.
                Только вот если выращение довольно общее и осмысленное, оно может еще где-нибудь пригодиться.

                Вообще нужно взять за правило и любое самостоятельное выражение сложнее чем x+y-z выносить в функцию.

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

                А вообще: "Сначала напиши, чтобы работало. Потом сделай красиво. Потом сделай быстро."
                Ответить
                • > Тогда весь код будет состоять из настолько маленьких функций, что одного взгляда на них будет достаточно, чтобы понять, правильно она написана или нет...
                  ... но понять, что же код делает в целом, будет, увы, нереально.
                  Ответить
                  • Он делает то, что делает функция main()
                    Ответить
                  • вот тут я с вами не соглашусь. разбиение на функции - повышает качество читаемости кода. главное с функциями до маразма не доходить.

                    пример:
                    public void onSelectValue() {
                        closePopup();
                        updateValue();
                        selectAllText();
                    }
                    Ответить
                    • Хороший пример, для понимания этой функции достаточно всего-лишь знать базовые концепции языка и десяток английских слов.
                      Ответить
          • Опасно это только если есть во вложенном ветвь else.
            Разворачивается спокойно, только вместо else внешнего блока будет elseif. И это гораздо лучше, нежели три степени глубины, да ещё и всё действие в ветви else.
            Ответить
            • т. е. вы считаете, что конструкция
              if (a && b && c) {...}
              else if (a && b && !c) {...}
              else {...}

              воспринимается легче?
              Ответить
              • Да, вполне. Условие видно на строке и очевидно. Если исключать случаи размера условия, разумеется. Когда это уменьшит уровень вложенности - уже плюс.
                Ответить
                • Спорный вопрос. В примере, который привёл fai, дополнительный уровень вложенности сделает логику более понятной, а ещё позволит избежать дублирования проверки a&&b. Но в исходном посте, поскольку рабочий блок всего один, конечно, лучше все условия в один if собрать.
                  Ответить
          • > при схлопнутом if код с вероятностью 95% будет добавлен не в ту else ветвь
            Если у автора все настолько печально, что он не сможет вынести if(c) обратно, когда это понадобится, и, вместо этого, захуячит код в первое попавшееся else, то ему и такие приемы не помогут.
            Ответить
            • тут я не соглашусь: лучше предупредить возникновение ошибок парой лишних строк. Зачем себе создавать проблемы? Увидев этот схлопнутый if через полгода будет намного сложнее восстановить в памяти (или разобраться) в логике. Развернутый if служит своего рода меткой - "здесь все не так просто"
              Ответить
              • Ок, давайте все ифы разворачивать? ВДРУГ ему нужно будет и к b добавить else. А ВДРУГ к a? А еще давайте все else писать сразу, с фразой // do nothing ведь пишущий их может промахнуться, и, когда они ему понадобятся, приставить их не туда.
                Ответить
                • //простой if превращается...
                  if (a && b) { Something } //превращается в...
                  
                  if (a) {
                    if (b) {      //a && b
                      Something
                    } else {      //a && !b
                      Nothing
                    }
                  } else if (b) { //!a && b
                    Nothing
                  } else {        //!a && !b
                    Nothing
                  }
                  Ответить
                • ну что вы сразу в крайности бросаетесь?

                  Развернутый if служит своего рода меткой - "здесь все не так просто". И такая ситуация встречается редко (один раз из ста, может даже реже). И это признак того, что надо отнестись к этому месту не просто внимательно, а очень внимательно. Таким кодом вы просто помогаете себе в будущем.
                  Ответить
    • Не идеально конечно (пустой блок if, магичекие числа), но кроме этого все нормально.
      Ответить
    • мне одному кажется что если прочитать комментарии выше то можно узнать смысл жизни, от чего крутится Де-Морган, всю правду про абсциссу и ординату, дизъюнкцию и конъюнкцию, узнать кто убил Кеннеди, каждый придумал как бы он написал подобный if и ещё много загадок вселенной?)
      Ответить
      • Вся суть ГК
        Ответить
      • А еще - почему зеркало отражает справа налево, про левостороннее движение во владивостоке, о перекрестке по дороге на дачу Тараса...
        Ответить

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