Виктор Калесников
30 декабря 2021 г. 18:53

Как создать класс вызывающий функции по входному числу 0-255?

network, server, protocol

Есть сетевой проприетарный протокол, который присылает пакет с командой в числовом обозначении 0-255.
В зависимости от того какое будет число и будет вызываться конкретный метод обработки пакета.
Сейчас это громоздкий switch что очень некрасиво и тупо :)
Что можно придумать по принципам ООП?
Ничего подходящего не приходит на ум :(

Буду очень благодарен за подсказки.

2

Вам это нравится? Поделитесь в социальных сетях!

2
Виктор Калесников
  • 30 декабря 2021 г. 19:01
  • (ред.)

По такому принципу может быть?
Пока как то слабо себе представляю как реализовать вызов функции с именем перечисленным в списке enum: connect, message, notice.

class SoundEffect : public QObject
{
Q_OBJECT
public:
enum SoundType {
connect,message,notice,
};
Q_ENUMS(SoundType)
QString valueToKey(SoundEffect::SoundType index);
private:
QMetaEnum metaEnum;
};

    Evgenii Legotckoi
    • 30 декабря 2021 г. 20:23
    • Ответ был помечен как решение.

    Вы в любом случае упрётесь в маршрутизацию сообщения от этих цифр 0-255 до вызова конкретных методов и функций. А все эти пляски метасистемой Qt в данном случае лишь усложнение кода.

    Если у вас switch case выглядит так

    1. switch (number)
    2. {
    3. case 0: function_0(); break;
    4. case 1: function_1(); break;
    5. case 2: function_2(); break;
    6. }

    то это нормально, реально - это в порядке, если делать что-то подобное через метасистему, то в конечно счёте это переусложнит код и сделает его понимание довольно расплывчатым.

    Единственное, что будет реальный улучшением, это добавить enum, чтобы все эти числа не выглядели бы так магически.

    То есть сделайте так:

    1. enum SoundType
    2. {
    3. connect,
    4. message,
    5. notice,
    6. };
    7.  
    8. switch (soundType)
    9. {
    10. case SoundType::connect: connect(); break;
    11. case SoundType::message: message(); break;
    12. case SoundType::notice: notice(); break;
    13. }

    Таким образом код будет понятным, и по enum можно будет в других местах кода лучше организовать информацию.

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь