用坚实的原则用 arduino 写作

writing in arduino with Solid principles

本文关键字:arduino 写作 原则      更新时间:2023-10-16

我是一名C程序员,我是cpp的新手,出于某种可以理解的原因,我想用S.O.L.I.D的方式编写我的程序

我想用 OOP 在 Arduino 中用 c++ 编写一个程序。

有A类,B类,C类和D类。

  • classA 必须从串行端口获取数据并给出一个字节数组 到B类。
  • 类 B 做一些过程,给类 C 另一个字节数组
  • classC 使这个数组成为定义的格式,它要传播 输出。例如 JSON
  • classD 获取此输出并通过 mqtt 发送

我的问题是

  1. 如果我仅通过更改参数将串行端口更改为 SPI 或其他外设,我如何对 classA 进行编程?对象或实体应开放以进行扩展,但关闭以进行修改)
  2. 这些类如何相互通信,如果将来我不修改其他类的情况下选择 xml 而不是类 C 中的 json,我可以扩展 classC?

对不起英语不好如果我不清楚在评论中询问

嵌入式编程和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();
}

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