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

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    enet_uint32 flags = 0;
    
    if (flags & CPacket::RELIABLE)
        flags |=ENET_PACKET_FLAG_RELIABLE;
    
    return enet_packet_create(data, (writer.Tell() + 7) / 8, flags);

    Братишка сделал одинаковые названия локальной переменной и поля в классе.

    Запостил: tuxick, 03 Марта 2019

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

    • Неделя отладки
      Ответить
    • Именно поэтому я за m_flags.
      Ответить
      • А я поэтому за "PHP".
        Ответить
        • И то верно, в «PHP» без $this-> (или без self:: для статических полей) не сработает, поэтому там не перекрывается.
          Ответить
      • показать все, что скрытоvanished
        Ответить
      • > m_flags

        Хоть венгерка -- это фу, но в данном случае ИМХО единственный оправданый юзкейс. Аштрисет от такого:

        struct Foo {
          explicit Foo(int bar, int baz) : bar{bar}, baz{baz} {}
        
          int bar, baz;
        };
        Ответить
        • С какой-то версии правильное поведение гарантировано, не?
          Ответить
          • Поведение-то гарантировано, но выглядит всё равно отвратительно. А ещё можно словить лютый багор и не заметить:
            struct Foo {
              explicit Foo(int bar, int baz_refactored) : bar{bar}, baz{baz} {}
            
              int bar, baz;
            };

            Студия, ЕМНИП, на такое даже ворнинга не выдавала.
            Ответить
            • > baz(baz)
              Ну всё ок же. Явно указал, что надо оставить в переменной то, что там было. Чтобы всякие анализаторы не доёбывали.

              З.Ы. А для класса позовётся конструктор копирования из самого себя?
              Ответить
              • Позовётся: https://ideone.com/yuuKf4

                Вот это багор!
                Ответить
        • показать все, что скрытоvanished
          Ответить
    • показать все, что скрытоvanished
      Ответить
      • Вглядываться в тонкости подсветки? Нафиг. Да и не всегда код видишь через ide.
        Ответить
        • да не. на самом деле это не так сложно и сразу бросается в глаза.
          idea сразу будет подчеркивать тебе локальную переменную и говорить что она скрывает поле. кроме того. он сразу сделает подстветку if (...) заметно темной и предложит выбросить его т.к. услове всегда false и код под ним не выполняется никогда. так что не все так плохо.
          Ответить
          • Прям при дефолтных настройках? А то gcc даже на -Wall -Wextra почему-то не считает это проблемой... Надо -Wshadow явно врубать.
            Ответить
          • З.Ы. Ну и надеяться на ворнинги от IDE глупо, имхо. Если конпелятор/анализатор не ломают билд, то постепенно весь проект засрётся ворнингами. И всем будет на них похуй, многие тупо отключат их в IDE чтобы не мешало. А вимоёбы вообще насрут и не заметят.

            Настройки ворнингов должны быть консистентны как между билдом и IDE так и между всеми разрабами в команде. Иначе это всё хуйня и не работает.
            Ответить
        • показать все, что скрытоvanished
          Ответить
    • Вечер удивительных историй.
      Ответить
    • Еще бывает, что член класса обозначается подчеркиванием после:
      foo_ = foo;

      (в Qt раньше такой стиль был принят)
      _foo было бы красивее (как пишут в Питоне), но так не рекомендуется по стандартам языка.
      НУ ПОЧЕМУ
      Ответить

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