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

    +165

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    std::vector <CElement> elemGun
     std::vector <CElement> eOther
    ...
    elemGun[0].wVx/=2.f;
    elemGun[0].wVy/=2.f;
    eOther.push_back(elemGun[0]);
    elemGun[0].wVx*=2.f;
    elemGun[0].wVy*=2.f;
    ...

    Запостил: ssAVEL, 21 Апреля 2011

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

    • Прошу сказать как надо было: варианты есть, но хочется услышать ваше мнение.
      Ответить
      • чего тут думать, изменять надо по месту, а не выполнять популярную операцию "подергивание".
        Ответить
      • eOther.push_back(elemGun[0]);
        eOther..back().wVx/=2.f;
        eOther..back().wVy/=2.f;
        Ответить
      • Во-первых, я бы не извращался с какими-то экономиями вообще, а просто завел промежуточный элемент

        CElement e = elemGun[0];
        e.wVx /= 2;
        e.wVy /= 2;
        eOther.push_back(e);


        Во-вторых, "страннокодом" (чтбы не сказать резче) является операнд вида '2.f' для такого compound assignment. Ни 'f', ни плавающий тип тут ни нафиг не нужен. Пишите просто '2'. (Не ясно, чем руководствовался автор, старательно выписывая такой делитель/множитель.)
        Ответить
        • ...Если речь идет не о "делении пополам", а о делении на какой-то коэффициент (который просто случайно оказался равен двум), то использование плавающего типа будет вполне оправданым, но 'f' по-прежнему будет ни к селу ни к городу.
          Ответить
        • Иногда экономия уместна.
          eOther.push_back(elemGun[0]);
          CElement & e = eOther.back();
          e.wVx /= 2;
          e.wVy /= 2;
          Ответить
          • Прекрасно. Но мне лично мой вариант кажется более предпочтительным с абстрактной точки зрения. Сначала мы полностью приготавливаем значение. Потом кладем готовое значение в контейнер. В вашем же варианте существует момент, когда в контейнере 'eOther' лежит "неправильное"/"незавершенное" значение.

            Это, разумеется, весьма абстрактные рассуждения. Но если производительность моего варианта одинакова или хотя бы достаточна, я бы выбрал именно его.
            Ответить
            • Я же говорю — иногда эта экономия уместна. Когда этот код вызывается миллионы раз в секунду, а копирование дорого. Иногда даже удобно push_back пустой объект, а доинициализировать уже на месте.
              Ответить
            • >мне лично мой вариант кажется более предпочтительным
              Своя рубашка ближе к телу
              Ответить
      • const CElement operator/(const CElement &el, const double factor)
        {
        return CElement(el) /= factor;
        }
        
        далее
        eOther.push_back(elemGun[0] / 2);
        Ответить
    • С++...
      Опять эзотерика...
      Кстати, этот язык вообще всерьёз используют?
      Ответить

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