我是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吗?
抱歉英语不好如果我不清楚,请在评论中提问
答案 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();
}
请注意,第一个版本在某些时候也可能需要切换用例(在此情况下,您可以决定应使用哪种输入类型)。