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

    +161

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    /// ...хде-то в начале огромной-преогромной функции...
    #define ADD_GRAPH(gid,gmod) m_Registry[TGraphId(gid,gmod)] = new
    /// ...хде-то по её середине...
    #define ADD_MAP_WEAPON_OVERLAY(name_base,file_name)\
      for (i=0; i<8; i++)\
      {\
        ADD_GRAPH(name_base _T("S"),i) (CLoadImage (\
          file_name,\
          TImageFX ()\
          .SetColorReplacementFX (g_WeaponRecolor[i],2,0)\
          ));\
        ADD_GRAPH(name_base _T("Q"),i) (CLoadImage (\
          file_name,\
          TImageFX ()\
          .SetColorReplacementFX (g_WeaponRecolor[i],2,1)\
          ));\
      }
    #define ADD_MAP_WEAPON_OUTLINE(name_base,file_name)\
      ADD_GRAPH(name_base _T("C"),0) (CLoadImage (\
          file_name,\
          TImageFX ()\
          .SetColorReplacementFX (g_WeaponRecolor[0],2,2)\
          ));
    
    ADD_MAP_WEAPON_OVERLAY (_T("CellSword"),_T("cell_weap_sword.png"));
    ADD_MAP_WEAPON_OVERLAY (_T("CellAxe"),_T("cell_weap_axe.png"));
    ADD_MAP_WEAPON_OVERLAY (_T("CellEshock"),_T("cell_weap_eshock.png"));
    ADD_MAP_WEAPON_OVERLAY (_T("CellLance"),_T("cell_weap_lance.png"));
    //... тут очень много в таком же духе ...
    ADD_MAP_WEAPON_OUTLINE (_T("CellXbow"),_T("cell_weap_xbow.png"));
    ADD_MAP_WEAPON_OUTLINE (_T("CellRifle"),_T("cell_weap_rifle.png"));
    ADD_MAP_WEAPON_OUTLINE (_T("CellPistol"),_T("cell_weap_pistol.png"));

    >Как бы оно выглядело без макросов, предоставляю гадать желающим.
    Эстеты, разумеется, могут возопить: "Пошто было не вынести всё это в функцию?!" Пото, что функцию (а она потребовалась бы методом) пришлось бы описывать в хедере вместе с классом + имплементировать где-то снаружи текущей функции - весёлое занятие, нечего сказать. Это при том, что данный конкретный кусок кода на момент написания сильномутабелен в плане кол-ва требующихся параметров, и в перспективе мог вообще исчезнуть/слиться с другим. И таких кусков там ~100500. Возможностей, с которыми использование функций для подобного действа не является злобным буратинством, в моём местном С++ пока не наличенствует. А так все релевантные к специфике данного куска пиписьки сконцентрированы в одном месте, умещаются на 1 экран, и я спокоен за возвращение к нему через много времени.

    Запостил: CPPGovno, 21 Августа 2011

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

    • А #undef-ы есть?
      Ответить
    • учитесь писать скрипты (или на виндах: программы) для кодогенерации. и говна меньше как выше будет, и тестировать проще: прогнал скрипт, с выводом в файл перенаправленым, и получаешь сырец который можно по человечески читать.
      Ответить
      • >учитесь писать скрипты
        Ничего писать не нужно. Для кодогенерации есть готовые специальные инструменты.
        Ответить
      • И вообще:
        Открываю переводное издание "современного проектирования на С++" на странице 86 и читаю:
        Это означает, что мы вообще больше не будем писать программы, а заставим компилятор делать это за нас.
        Ответить
        • из http://en.wikipedia.org/wiki/Unix_philosophy - Rule of Generation:

          Avoid hand-hacking; write programs to write programs when you can.
          Ответить
          • ...and don't write program, when other program can write program without you.
            Ответить
            • в общем то я согласен.

              но по моему тебе еще раз нужно вчитаться внимательно в ГК приведенный выше.

              написать базовый скрипт для генереции того что приведино в ГК, и его интерграция в билд систему, по крайней мере на юнихе, занимает столько же времени сколько я только что потратил на ответы тебе.
              Ответить
    • Эстет возопит: «Пошто не используете внешние конфиги?»
      Ответить

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