Jawa / Говнокод #12211 Ссылка на оригинал

0

  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 smpl, (Updated )

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

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

              В английском все проще - numerator и denominator
              Ответить
              • А я лево и право с детства путаю. Потому что это довольно абстрактные понятия.
                Ответить
                  • А попробуй-ка объяснить инопланетянину по радио, где лево и где право.
                    :7
                    Ответить
                    • Зачем по радио? Ментально, сквозь тысячи световых лет пустоты.
                      Ответить
                      • Так вроде бы завихрения каких-то полей направлены в одну сторону.
                        В общем, я в книге "зри в корень" это, кажись, как-то читал и там нашли решение.
                        Ответить
                        • А я в сборнике научной фантастики прочитал. В том рассказе они не нашли решения и ткнули кнопку наугад. Благо, всё обошлось благополучно.
                          Ответить
                          • Юг - там где большая глыба льда
                            Север - с другой стороны
                            (или описываем юг север через любой другой материк)
                            встаем так, чтобы смотреть на север, юг у нас за спиной
                            право там, с какой стороны встанет солнце
                            Ну или любым другим способом, связанным с вращением планеты (завихрение воздушных потоков, омывание одного из берегов реки...)
                            Ответить
                            • Нет, вроде то ли по объектам микромира, то ли наоборот, по известным объектам макромира.
                              Ответить
                    • Это сходно с попытками объяснить почему в зеркале меняются сторонами право и лево, а не верх и низ, например.
                      Ответить
                      • Блджад, а ты кто в той эпичной теме на крестофоруме?
                        Ответить
                        • Вы обознались. Я на геймдев не хожу.
                          PS. А можно сцылочку. Тема-то шибко срачная.
                          Ответить
                            • О, спасибо. Тред доверху наполнен бредом.
                              Так это ж древний вопрос.
                              Кстати давно в книжке какой-то читал, что у Билли Гейтса спейциальное цифровое зеркало в ванной, которое ничего не переворачивает.
                              Потому он до таких срачей не опускается.
                              Я бы положил на пол.
                              Ответить
                • Спасибо, хороший пример, позволяющий быстро запомнить, что знаменатель - это делитель.
                  Ответить
                  • Имхо, сам язык даёт нам достаточно подсказок. Все говорят "числитель и знаменатель", а "знаменатель и числитель" никто не говорит; соответственно, поскольку мы пишем сверху вниз, то наверху числитель, внизу знаменатель. Аналогично "абсцисса-ордината", а не "ордината-абсцисса", им в алфавитном порядке соответствуют 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) - для того, чтобы одновременно делить горошину на всю семью, соревноваться в запоминании цифр числа пи и притворяться, что знаешь зачем нужны мнимые числа.
                Ответить
                • > знаешь зачем нужны мнимые числа
                  я продуктивно использовал их на олимпиаде по математике в универе при доказательстве тригонометрических формул. Сводишь синусы с косинусами к комплексным экспонентам, а дальше простая алгебра.
                  Ответить
                  • Ага, только правило сложения угла при умножении доказывается как раз через формулы тригонометрии.
                    Ответить
                  • > я продуктивно использовал их на олимпиаде по математике в универе
                    > 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
            Ответить
              • Зачем терпеть? Можно написать функцию, которая прибавляет и присваивает значение, и терпеть больше не нужно будет.
                Ответить
                • Совершенно верно, addDuration(d). Видимо, большая часть жабо программистов начинает забывать, что ООП это нечто большее, чем toString() и геттеры с сеттерами.
                  Ответить
        • Из кода клиента Haven&Hearth:
          mv.mc = player.getc().sub(s2m(center.sub(mv.pmousepos).
              mul(diff).div(center)));
          Ответить
          • Мало скобок и код неправильный.

            Сравни:
            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
                Ответить
              • && надо. При инвертировании общего выражения надо не только внутренние условия инвертировать, но и || на && менять и наоборот. А после этого не забыть проверить приоритет операторов.
                Ответить
            • ну кто так сравнивает? вот как надо
              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) {
                      // ...
                  }
                  Ответить
        • 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 выносить в функцию.

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

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

                  пример:
                  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 и ещё много загадок вселенной?)
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8