用扎实的原则在arduino中写作

时间:2019-05-30 22:03:02

标签: c++ solid-principles

我是C程序员,并且是cpp的新手。出于某些可以理解的原因,我想以S.O.L.I.D的方式编写程序 我想用OOP在Arduino中用c ++编写程序。

有classA,classB,ClassC和classD classA必须从串行端口获取数据,并将字节数组提供给classB。 ClassB做一些处理,并将另一个字节数组提供给classC classC将此数组转换为定义的格式以支持输出。例如json classD获取此输出并通过mqtt发送

我的问题是 1.如果仅通过更改参数将SerialPort更改为SPI或其他外围设备,该如何编程classA?(对象或实体应该打开以进行扩展,而关闭以进行修改)

2。这些类如何相互通信,如果将来在classC中而不是json时选择xml而不修改其他类,我可以扩展classC吗?

抱歉英语不好如果我不清楚,请在评论中提问

1 个答案:

答案 0 :(得分:0)

嵌入式编程和OOP并不是最好的朋友,尤其是在像Arduino这样非常有限的系统中。经典OOP中两个问题的答案都是多态性(具有虚函数)。您可以为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();
}

请注意,第一个版本在某些时候也可能需要切换用例(在此情况下,您可以决定应使用哪种输入类型)。