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

    +120

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    // See where we currently are in a calendar quarter.
    // In Java, JANUARY == 0.
    // Yes, I could just write (3 - currentMonth % 3),
    // but this is clearer
    switch (currentMonth % 3) {
    case 0: // January, April, July, October
    	monthsToInclude = 3; // include whole last quarter
    	break;
    case 1: // February, May, August, November
    	monthsToInclude = 2; // include first two months of this quarter
    	break;
    default: // March, June, September, December
    	monthsToInclude = 1; // include first month of this quarter
    	break;
    }

    Или всё-таки наплевать на читаемость и заменить короткой версией?

    Запостил: someone, 23 Августа 2012

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

    • Так. Оказалось, что тут логическая ошибка. Должно быть наоборот: case 1 = 1, default = 2. Так что сокращённая формула не подходит.
      Ответить
      • val Number = currentMonth % 3
        monthsToInclude = val == 0 ? 3 : val == 1 ? 1 : 2 :D
        Или составить массив с параметрами месяцев раз и навсегда?
        По мне мутное условие к которому надо читать комментарии...
        Ответить
        • >monthsToInclude = val == 0 ? 3 : val == 1 ? 1 : 2 :D
          facepalm.gif

          Yes, I could just write normal branchless code, but this is crappier.
          Ответить
        • >По мне мутное условие к которому надо читать комментарии...
          Я как-то раз такое написал: http://govnokod.ru/8624 и то меня заминусовали.
          Ответить
          • > select 7-(8-datepart(weekday,getDate())) % 7
            Может быть стоит переписать так?
            select datepart(weekday,getDate())+6) % 7 + 1
            Ответить
            • Ну и смысл в этом "переписывании":? Для четверга всё-равно будет 5.
              (5+6) % 7=4+1=5
              А у меня 4.
              7-(8-5) % 7=7-3=4
              Ответить
              • Да ну? Мой код более бажный. Он возвращает то же самое, что и на входе ;)
                Ответить
                • >Да ну? Он возвращает то же самое, что и на входе ;)
                  Ну да.
                  >Мой код еще более бажный
                  У меня-то код работает без багов. Просто сильно закрученный.
                  Ответить
              • Правильно переписанный вариант: (datepart(weekday,getDate())+5) % 7 + 1
                (5+5) % 7 + 1 = 3+1 = 4
                (1+5) % 7 + 1 = 6+1 = 7

                Ну а так согласен: "работает - не трогай".
                Ответить
                • Круто. И как я не догадался до такого?
                  Но вообще я потом выкинул то говно и нагуглил как в БД поменять день начала недели.
                  Ответить
                  • > как в БД поменять день начала недели.
                    А вдруг на этом был основан какой-либо код?
                    Ответить
                  • Option Base 1
                    Option Monday 1
                    Option January 1
                    Ответить
    • 3 - currentMonth % 3 вполне понятный код:

      В квартале 3 месяца.
      Для начала находим сколько полных месяцев прошло от начала текущего квартала: currentMonth % 3
      И затем вычитаем это количество из трех - столько (возможно неполных) месяцев и осталось до конца квартала.

      P.S. Предлагаю над строкой 3 - currentMonth % 3 написать комментарий, в духе "определим, сколько месяцев осталось до конца текущего квартала".
      Ответить
      • > Оказалось, что тут логическая ошибка. Должно быть наоборот: case 1 = 1, default = 2. Так что сокращённая формула не подходит.
        Хм. Тогда сорри.

        Формула будет вот такая: 1 + (currentMonth+2) % 3. Но она мне не нравится.

        Можно еще так:
        int monthToInclude = (currentMonth + 1) % 3;
        if (monthToInclude == 0) {
            // we need to check all previous quarter
            monthToInclude = 3;
        }
        Ответить
        • s/all/whole/
          Ответить
        • Можно таки уже напейсать один раз пару функций для модульной арифметики (или найти готовое) и перестать извращаться.

          >1 + (currentMonth+2) % 3 Но она мне не нравится.
          Такое же получилось. Мне тоже не нравится. Вариант с явной проверкой на ноль лучче. Но надо завести функцию - ifZero(x,y)
          А вторая функция будет такой:
          ifZero( (num + k) % n,n)
          Ответить
    • Он любил и страдал: он любил жаву, и страдал от её калечных дат.
      Ответить

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