1. C++ / Говнокод #18965

    +5

    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
    16. 16
    17. 17
    struct DateTime {
        string x;
        DateTime() { x = Now(); } 
        DateTime(const string& _x): x(_x) { if (BadDateTime) throw Exception(); }
        operator string() { return x; }
    };
    
    string correctDateTime(const string& value)
    {
        try
        {
            DateTime(value); // if the value is bad, ctor will throw
            return value;
        }
        catch (…) {}
        return DateTime(); // and we replace bad DateTime with currentDateTime
    }

    Где ошибка?

    Запостил: Bobik, 04 Ноября 2015

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

    • В хранении даты в строке?
      Ответить
      • Нет, тут это не принципиально. Можем считать, что x -- это struct timeval.
        Ответить
    • DateTime(value);
      Это определение новой переменной с вызовом конструктора по умолчанию, а не вызов конструктора с одним параметром. А всё от того, что кто-то считает себя слишком умным и использует исключения не по назначению.
      Ответить
      • И у нас победитель!

        Исправляется через (void) DateTime(value) или (DateTime(value));
        Ответить
        • Исправляется публикацией клиенту функции isBadDate(const std::string& s), используемой в конструкторе DateTime и кодом
          return isBadDate(s) ? Now() : s;
          Ответить
          • Функция isBadDate находится в private, скорее всего, разработчик библиотеки менять это не будет.
            Ответить
            • А, я думал, что класс доступен для модификации. Тогда лучше привести к форме
              string correctDateTime(const string& value)
              try {
                  DateTime dt(value);
                  return dt;
              } catch (const Exception& e) {
                  return DateTime();
              }
              Ответить
            • > Функция isBadDate находится в private, скорее всего, разработчик библиотеки менять это не будет.

              дайте угадаю мотивацию "private": потому что никому никогда не понадобится проверка валидности строковых дат?
              Ответить
            • Скажи ему, что он упоротая траеблядь.
              Некорректность строки - это сука не исключительная ситуация.
              Ответить
              • А что? Вводить во все классы isNull() / isFail()?
                Ответить
                • Думать головой, не писать логику на исключениях, понимать слово "исключительная".
                  Ответить
                  • Я бы, наверное, сделал функцию parseDate(), которая не кидает исключений и сигнализирует об ошибке каким-то другим способом. А конструктор DateTime() со строкой убрал бы нахуй, чтоб неповадно было.
                    Ответить
                    • Прямо как в Qt. Но, увы, разработчики той библиотеки не знают Qt и велосипедят по-своему.
                      Ответить
                      • И в бусте, и в джаве, и вроде даже в питоне... Имхо, парсингу и форматированию дат вообще не место в DateTime. Там же 100500 вариантов их записи...
                        Ответить
                    • Конструкторы вообще убрать надо. Так читаемее будет:
                      static DateTime::currentDate(),
                      static DateTime::fromString() throws FormatException
                      Ответить
                • Датам один хуй нужно isValid(), т.к. иначе дефолтный конструктор придётся выкинуть на мороз. Ибо дефолтный конструктор, возвращающий текущую дату - очень, очень, очень хуёвый вариант.
                  Ответить
      • > Это определение новой переменной с вызовом конструктора по умолчанию
        Блин, обожаю синтаксис крестов. Каждый день что-то новое ;)
        Ответить
      • это ж сколько говна надо перекопать на своём веку чтобы такое знать?
        Ответить
        • Что тут знать? Это просто объявление переменной, такое даже в чистом си работает: https://ideone.com/A1On20
          Разница в том, что в си нет конструкторов и в переменных будет мусор, а в плюсах вызовется конструктор по умолчанию для классов.
          Ответить
      • Когда ввели крестошаблоны, перегрузили знаки «меньше» и «больше» для шаблонов.

        Когда добавили лямбды, перегрузили квадратные скобки для лямбд.

        Теперь ещё и круглым скобкам нельзя доверять.

        Разработчики крестов по какой-то причине экономят символы. Создаётся ощущение, что у них такая клавиатура:
        https://c-a.d-cd.net/129cba2s-480.jpg
        Ответить
        • Когда ввели крестошаблоны, мне было всё равно, ведь я не крестошаблон.
          Когда добавили лямбды и перегрузили квадратные скобки для лямбд, то мне было всё равно, ведь я не квадратная скобка
          Когда перегрузили круглые скобки, некому было за меня заступиться.
          Ответить
          • Просто в нормальных языках
            а) конструкторы не называются так как и классы
            б) в объявлении сначала идёт имя переменной, а потом тип
            Ответить
        • вот только круглые скобки нехорошо себя вели раньше, чем ввели шаблоны и лямбды.
          Кстати, лично я не вижу толкового способа обозначения лямбд без квадратных скобок (внутри которых перечислены захватываемые символы)
          Ответить
          • А я вижу. В PHP используется слово use, смысл которого интуитивно ясен.
            Ответить
            • которое имеет какое-то отношение к лямбдам? оО
              Ответить
            • >Кейворд
              >Крестоблядство
              С ума сошёл? Еще столько значков неиспользованных! Более того еще столько значков не использованных по пятому разу!
              Ответить
              • Действительно. Есть же `, @, $, ^, _, \, плюс возможные диграфы и триграфы, а они используют скучные квадратные скобки. Уже представил:
                \x, y, z\(a, b, c){return x*a + y*b + z*c;}

                Или с диграфами:
                (: x, y, z :)(a, b, c){return x*a + y*b + z*c;}


                Такими методами кресты станут похожи на J.

                P.S. Мне слово «return» не нравится: выбивается из стиля. Нужно заменить на какой-нибудь значок.
                Ответить
                • > P.S. Мне слово «return» не нравится: выбивается из стиля. Нужно заменить на какой-нибудь значок.
                  $?
                  int ticket(person* p) {
                    if(p->isForeigner()) $ 100;
                    if(p->isTourist()) $ 20;
                    else 100 ₽;
                  }
                  Ответить
                  • if else тоже надо заменить на ?:
                    p->isForeigner())?
                    $ 100
                    :p->isTourist()?
                    $20
                    :100
                    Ответить
      • Почему? Я не понимаю.
        Ответить
    • >

      В ворде набирал?
      Ответить
      • #define … ...
        Ответить
        • #define © (C)
          #define ® (R)
          #define â„¢ (TM)
          #define « "
          #define » "
          #define “ "
          #define ” "
          #define „ "
          #define ‘ '
          #define ’ '
          #define — --
          #define 😉 ;}
          Ответить
          • > #define « "
            Интересно, если Ворд будет заменять ещё и << на «, то пиздец же будет
            Ответить
            • Где-то я видел такую замену (на стене во Вконтактике или в каких-то бложиках). Я ещё колебался, написать #define « << или #define « ". Придётся делать макрос с ветвлением (ифдеф) в зависимости от источника программы.
              Ответить
          • int main() {
              cout << «Hello world!» << endl;
              return 0 😉
            Ответить
      • Эт всё макбук(((
        Ответить
    • Тред архидоставил.
      Кресты своей ебанутостью явно не дают скатица сайту.
      Ответить

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