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

    +56.1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    UINT aScrollMode = 0;
         m_pScrollH->GetInfo(&aScrollMode, 0, 0);
         if (!(aScrollMode & M_INVISIBLE))
         {
              ...
         }

    Рефакторю довольно большой проект (5 Мб исходников). Единственный способ спросить у контрола (любого из имеющихся) привожу выше.

    Запостил: Konstantin.Grebenschikov, 22 Октября 2009

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

    • *спросить, видим ли он
      Ответить
    • Однако, терпение Вам понадобится :-)
      Ответить
    • Как вариант - инлайновую функцию которая и будет проверять и возвращать результат.
      Делаем динамик каст контрола к классу содержащему эту функцию и возвращаем результат проверки.

      Это еще очень хороший код, я успешно разгребал более худшие.
      Ответить
      • То что мне регулярно приходится разгребать еще более худший код не делает этот хорошим. Применение битовых полей для разбора состояния объекта, применение inline функций без доказанной необходимости оптимизации быстродействия, необходимость писать 3 строки сопровождающего кода для простейшего действия - это говнокод.
        Ответить
        • А битовые поля-то чем не угодили?
          Ответить
          • Для внутреннего представления состояния объекта? Да всем :-)
            Отличие битовых полей от структуры - увеличение сложности и, вероятно, оптимальности кода в плане быстродействия в пользу оптимальности в плане используемой памяти. Причем жестко зашитое в код.
            Отличие структуры от объекта - наличие контролируемого поведения.
            Использование битовых полей вместо объектов - сумма вышеперечисленного.
            Ответить
            • Что-то не совсем понятно. В быстродействии отличия минимальные. Это тоже самое что биты вручную выставлять. А поведение никто не мешает контролировать. Битовые поля не влияют на остальное содержимое класса.
              Если только ты имеешь в виду наличие большого количества полей (десятки-сотни). Тут я согласен.
              Ответить
              • Как правило работа с битами, вручную или через битовые поля медленнее и сложнее. Главное из-за чего их применять не следует - код становится сложнее, а значит менее читаемым.

                Практически любое битовое поле легко преобразуется в структуру. Парадокс в том, что в ООП структуры встречаются крайне редко. Как только однородные данные оказываются сосредоточенными в одном месте (info контрола в данном примере), становится видно, что их удобно наделить поведением. Хотя бы проверкой согласованности внутреннего состояния.

                например, сравните с тем, что было наверху:
                if ( m_pScrollH->GetInfo().Visible() )
                {
                ...
                }
                Проще?
                Единственный случай, когда мне приходилось применять битовые поля, и это было оправданным, подготовка структуры данных для пересылки другому устройству.
                Ответить
              • Биты вручную выставлять можно быстрее, чем компилятором, тк компилятор, даже при максимальной оптимизации делает это хуже адекватного проффессионального программиста.
                Покрайней мере VS 2008 это сделает хуже меня, даже без прибегания к ассемблеру(применением логических операций) Измерял.
                Ответить
    • Гдэ сдэсь сэпэпэ?
      Ответить
      • Там где вызывается operator->() =)
        Ответить
        • Я не увидел. Да.
          Ответить
        • void f() {}
          struct bbb
          {
          void (*f)(void);
          };
          int main()
          {
          struct bbb s, *pd;
          s.f=f;
          pd=&s;
          pd->f();
          }
          Чистый С.
          Ответить
    • крепитесь! :)
      Ответить

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