писать в Arduino с твердыми принципами - PullRequest
0 голосов
/ 31 мая 2019

Я программист на C и я новичок в cpp.По некоторой понятной причине я хочу написать свою программу на SOLID way

Я хочу написать программу на c ++ в Arduinoс ООП.

есть класс A, класс B, ClassC и classD.

  • classA должен получить данные из последовательного порта и передать массив байтов в classB.
  • ClassB выполняет некоторый процесс и передает еще один массив байтов для classC
  • classC превращает этот массив в определенный формат для его дальнейшего вывода.например, json
  • classD берет этот вывод и отправляет его через mqtt

мои проблемы

  1. как я могу запрограммировать classA, что если я изменю SerialPort на SPIили другое периферийное устройство, просто изменив параметр? (Объекты или сущности должны быть открыты для расширения, но закрыты для модификации)
  2. как эти классы взаимодействуют друг с другом, что если в будущем вместо json в классе C я выберу xml безизменив другой класс я могу расширить classC?

извините за плохой английский Если мне не понятно спросите в комментарии

1 Ответ

0 голосов
/ 31 мая 2019

Встроенное программирование и ООП не лучшие друзья, особенно в очень ограниченной системе, такой как Arduino. Ответ на оба вопроса в классическом ООП - полиморфизм (с виртуальными функциями). Вы можете создать интерфейс для classA и реализовать получение данных различными способами в каждом производном классе.

class DataGatherer {
public:
    virtual char* getData() = 0;
    virtual ~IClassA () = default;
};

class SerialPortDataGatherer: public DataGatherer {
public:
    char* getData() override { 
        //any code here
    }
};

Для решения с меньшими затратами ресурсов вы можете довольно легко сопоставить параметр с функцией (например, с помощью простого оператора switch-case), если функции будут иметь общий формат (например, они возвращают массив данных или все, что вам действительно нужно) )

enum DataSources {
    SerialPort,
    SPI
}

char* getDataFromSerialPort() {
// logic here
}

char* getDataFromSPI() {
// logic here
}

char* getData(DataSources source) {
    switch(source) {
    case SerialPort:
        return getDataFromSerialPort();
    case SPI:
        return getDataFromSPI();
}

Обратите внимание, что первая версия, вероятно, потребует также переключателя в некоторый момент (где вы принимаете решение, какой тип ввода вы должны использовать).

...