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

    +57

    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
    33. 33
    34. 34
    35. 35
    36. 36
    struct ShaderBuilder
    {
    	Shader ToShader() const;
    
    	ShaderParts::VertexDataSrc VertexDataSource;
    	ShaderParts::Transform Transformation;
    	ShaderParts::LightControl LightControl;
    	ShaderParts::ColorSrc DiffuseSource;
    	ShaderParts::EmissionSrc EmissionSource;
    	ShaderParts::SpecularSrc SpecularSource;
    	ShaderParts::HeightSrc HeightSource;
    	ShaderParts::NormalSrc NormalSource;
    	ShaderParts::Parallax Parallax;
    	ShaderParts::LightModel LightModel;
    
    	...
    };
    
    #define with(x) for(auto &_=(x), *firstIter=&_; firstIter; firstIter=nullptr)
    
    ...
    
    using namespace ShaderParts;
    ShaderBuilder floorShaderBuilder;
    with(floorShaderBuilder)
    {
    	_.Transformation=Transform::Default();
    	_.LightControl=ShaderParts::LightControl::DefaultLighting({ {DirectionalLight::Type, 1} });
    	_.DiffuseSource=ColorSrc::FromTexture();
    	_.SpecularSource=SpecularSrc::FromConstants("0.25", "16.0");
    	_.HeightSource=HeightSrc::FromHeightMap();
    	_.NormalSource=NormalSrc::FromNormalMap("rg");
    	_.Parallax=Parallax::SimpleParallax();
    	_.LightModel=LightModel::Phong();
    }
    floorSh=floorShaderBuilder.ToShader();

    Вот такой оператор with на C++.

    Запостил: gammaker, 04 Августа 2014

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

    • КО!
      Ответить
    • А чем
      with(floorShaderBuilder)
      {
          // using magic _
      }

      лучше
      {
          auto &_ = floorShaderBuilder;
          // using non-magic _
      }
      Слишком мало макросов и магии?
      Ответить
      • Ностальгия По Дельфи
        Я Бы Ещё Ключевые Слова С++ Замакросил, А То Режет Глаза Этот Нижний Убогий Регистр
        Ответить
        • > Ностальгия По Дельфи
          @gammaker вроде по D угарает
          Ответить
          • А ты откуда знаешь? Запомнил что ли? Я тут уже пару лет не появлялся наверное.
            Ответить
            • Тут на всех досье есть в 3 экземплярах
              Ответить
      • Синтаксис чище. В блоке находится только то, с чём работаем, никаких посторонних объявлений переменных. И блок не висит в пустоте, а идёт после with.
        Я на Delphi никогда не писал, но такую конструкцию видел в языке D. А если мне какая-то фича в каком-то языке нравится, то я её пытаюсь перенести в C++. А перейти сам на другой язык не могу, потому что у всех есть фатальные недостатки. У C++ их тем более полно, но не менять же шило на мыло.
        Вот если бы в C++ перенесли хотя бы designated initializers из C99, то я бы обошёлся без with.
        Ответить
        • попробуй воспользоваться конструктором
          там заодно тебе this будет в скоупе
          Ответить
          • Так это придётся делать по целому классу каждый раз, когда надо заполнить структуру.
            Ответить
            • в смысле?
              что тебе мешает сделать конструктор в структуре?
              Ответить
              • Видимо, отсутствие именованных параметров.
                Ответить
              • Во-первых, не все члены структуры надо заполнять, для многих подходят значения по умолчанию. Во-вторых, так как в структуре могут появляться новые члены и меняться их порядок, то всё сразу поломается, если при заполнении ориентироваться на их порядок в структуре или порядок аргументов конструктора.
                В-третьих, намного читабельнее, когда видно, какой член структуры заполняется.
                Ответить
                • я же говорю, есть и другие техники
                  см. The Boost Parameter Library

                  а так то в твоей структуре члены дважды инициализируются - сначала по умолчанию, а потом уже новым значением
                  при этом, твоя декларация и инициализация реально разведены по коду, так что
                  > так как в структуре могут появляться новые члены
                  ты можешь и прозевать тот момент, что их надо в другом месте как бы и присвоить
                  Ответить
                  • >см. The Boost Parameter Library
                    Посмотрел, там какая-то чёрная магия, которую можно постить на этом сайте. По сравнению с этим мой with вполне безобидно выглядит.

                    >а так то в твоей структуре члены дважды инициализируются - сначала по умолчанию, а потом уже новым значением
                    Ничего страшного в этом нет, это же генератор шейдеров. Их компиляция займёт времени в 10000 раз больше, чем потери на эту лишнюю инициализацию.

                    >ты можешь и прозевать тот момент, что их надо в другом месте как бы и присвоить
                    Я подбираю параметры по умолчанию так, чтобы ничего не изменилось. Если новый член не инициализировали вручную, то его как будто бы и нет. Расширение структуры ничего не ломает.
                    Ответить
    • Настало время заполнять структуры
      Структуры сами не заполнятся
      Ответить
    • Говнокодер не осилил конструктора, методы и ООП
      Ответить

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