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

    +52

    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
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    void ArmInterface::dispatchMessage(QString name, QJsonArray args)
    {
        //флаг того что мы не смогли обработать
        bool notCallbacks = true;
        //проходим по всем методам( которые кстати можно создать в рантайме )
        for( int i = 0; i < metaObject()->methodCount() ; i++ )
        {
            QMetaMethod method = metaObject()->method( i);        
            
            //имя метода подходит под имя под сообщение от сервера? Прекрасно проверяем дальше.
            if ( method.name() != name )
            {
                qWarning() << "method.name() != name" << " -> " <<method.name() << " != " << name;
                //так как метод не найден мы просто выйдем отсюда, не дожидаясь ничего плохого
                continue;            
            }
            //метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
            if ( method.access() != QMetaMethod::Public )
            {
                qWarning() << "Method " << method.name()<< " not public!";
    #ifdef IGNORE_NOT_PUBLIC_METHOD
                continue;
    #endif
            }
            //несовдатает количество аргументов? Хватит это терпеть пишем warning, и если надо выходим из этого диспатчера
            int countParams = method.parameterCount();
            if ( args.count() != method.parameterCount() )
            {
                qWarning() << "Method " << method.name() << " params count = " << method.parameterCount() << " and received args params count =  "  << args.count();
    #ifndef IGNORE_METHOD_PARAMS_COUNT
                continue;
    #endif
                //берем наименьшее количество параметров
                countParams = countParams > args.count() ? countParams : args.count();
            }
            
            //создание валидного QGenericArgument 
            auto genericArg = [ this, method, args ]( int index ) -> QGenericArgument{
                //out of range? 
                if ( args.count() <= index || 
                     method.parameterCount() <= index )
                    return QGenericArgument();
                void * data = 0;
                //сохраняем временный QVariant для дальнейшей более удобной работы с ним
                QVariant  temp = args.at( index ).toVariant();
                //попытка конвертирования типов. Если что-то не получается, пишем в лог. Мб надо будет сделать преждевременный выход, если сконвертировать не получается.
                if ( !temp.convert( method.parameterType( index) ) )
                {
                    qWarning()<< objectName() << " method : " << method.name() <<
                                 " Not convert " << method.parameterNames().at( index ) << args.at( index ).toVariant().typeName() << 
                                 " from " << args.at( index ).toVariant().typeName() << 
                                 " to " << QMetaType::typeName( method.parameterType( index) )  ;
                };
                //у нас есть такой аргумент? Если нет - то ничего не делаем
                if ( args.count() > index )
                {
                    data = QMetaType::create( method.parameterType( index ) , temp.data() );
                }
                const char * name = 0;
                //у нас есть имя аргумента и аргумент в него? Если чего-то нет - то ничего и не будем ничего делать
                if ( method.parameterNames().count() > index && data)
                    name = method.parameterNames().at( index ).data();
    
                return QGenericArgument(
                            name, 
                            data);
            };
            
            //тут можно вызывать! 
            method.invoke( this, 
                           //генерируем аргументы
                           genericArg(0),
                           genericArg(1),
                           genericArg(2),
                           genericArg(3),
                           genericArg(4),
                           genericArg(5),
                           genericArg(6),
                           genericArg(7),
                           genericArg(8),
                           genericArg(9));
            notCallbacks = false;
            //раз вызвали значит нашли подходящий callback, а следовательно искать дальше ненадо. Выходим нафиг.
            break;
        }
        //вызвали что -нить? Если вызвали то не вызываем ничего. А иначе идем в другую функцию - которая разбирается как раз с такими сообщениями.
        //Если надо перехватить совершенно все сообщения - перегружать функцию в которой находимся.
        if ( !notCallbacks )
            dispathUndefinedMessage( name, args );
    }

    Написал и мучаюсь - гавнокод или все таки нет.

    ахда, мне надо выучить русский )

    Запостил: Dart_Sergius, 02 Марта 2015

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

    • Нафига там в 13 строке ворнинг? Бесполезно же. На каждый метод, у которого имя не совпало будет писать... Лучше бы один после цикла.

      Олсо там есть QMetaObject::indexOfMethod() чтобы херню с циклом не городить...
      Ответить
      • P.S. Ну хотя indexOfMethod() с перегрузками не пашет.
        Ответить
        • Ну да, indexOfMethod я уже пробовал, и если типы не совпадают, но приводимы, то он нифига не находит, поэтому циклом сделал.
          Только сейчас додумался что надо сначало отфильтровать название методов, вынести их в отдельный список, и по нему уже бегать. Тогда можно вывести warning если метод не перегружен, и не приводятся аргументы к требуемому типу.
          Ответить
    • #include <pyqthon>
      Ответить
      • и что я этим получу?
        Ваще это подготовка к написанию обработчиков в js, а не в python.
        Это подготовка для скрещивания динозавра с глупозавром.
        Ответить
        • Ничего, это была щутка. О том, как статически тупизированный язык изящно превращается в динамически тупизированный.
          Ответить
        • Кстати, а кутишный js ведь и так спокойно работает с этой метаинфой - видит сигналы, слоты, свойства и инвокейблы. Или ты с другим движком скрещиваешь?
          Ответить
          • ну это обработчик клиентской части. Чтобы можно было сделать мусор из с++/js и человек, которому мой проект достанется не за что бы не разобрался что к чему.
            Ответить
    • for( int i = 0; i < metaObject()->methodCount() ; i++ )


      вам всем самим-то удобно такое форматирование разглядывать?
      Ответить
      • а что не так с ним? Просветите. Пробелов хватает, переменная i названа потому что используется в 1-м или 2-х местах...
        Ответить
        • Отбивка пробелами делает так, что заключенное в скобки нихера не группируется в сознании, а наоборот, выпирает. Во всех конвенциях (кроме wordpress) for _пробел_ (_нет пробела_ ...
          Ответить
    • все чаще суда приносят не - посмотрите какой кусок говна - а - погладьте меня по головке, я же молодец .

      >>//проходим по всем методам( которые кстати можно создать в рантайме )

      первый раз вижу что бы в коментах к коду хвалились и юзали слово кстати

      >> //метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
      инкапсуляция? нет, не слышал
      Ответить
      • > суда
        Из ливерпульской гавани всегда по четвергам
        Суда уходят в плаванье к далёким берегам...
        Ответить
        • А я как сказал?
          Ответить
          • Ты так и сказал: "Суда приносят из заморских стран куски говна..."
            Ответить
            • а может я так и хотел?
              Ответить
              • Просто борманд подсказал тебе путь как выкрутиться.
                А хотел ты совсем другого.
                Ответить
                • Раскусил, пес
                  Ответить
                  • Там похоже сказываются последствия дружбы с генератором.
                    Профессиональная деформация сознания.
                    Ответить
                    • Из ливерпульской ну гавани всегда кароч нах ну по четвергам
                      Суда уходят типа в плаванье кароч нах ну к далёким сука ептить берегам...
                      Ответить
        • Aaaaaaa, Aaaaaaa
          We come from the land of the ice and snow,
          From the midnight sun where the hot springs flow.
          Hammer of the gods will drive our ships to new lands.
          Ответить

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