用坚实的原则用 arduino 写作
writing in arduino with Solid principles
我是一名C程序员,我是cpp的新手,出于某种可以理解的原因,我想用S.O.L.I.D的方式编写我的程序
我想用 OOP 在 Arduino 中用 c++ 编写一个程序。
有A类,B类,C类和D类。
- classA 必须从串行端口获取数据并给出一个字节数组 到B类。
- 类 B 做一些过程,给类 C 另一个字节数组
- classC 使这个数组成为定义的格式,它要传播 输出。例如 JSON
- classD 获取此输出并通过 mqtt 发送
我的问题是
- 如果我仅通过更改参数将串行端口更改为 SPI 或其他外设,我如何对 classA 进行编程?对象或实体应开放以进行扩展,但关闭以进行修改)
- 这些类如何相互通信,如果将来我不修改其他类的情况下选择 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();
}
请注意,第一个版本在某些时候可能也需要开关情况(您决定应该使用哪种输入类型)。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 人脸跟踪arduino代码的优化
- vscode下的Arduino代码出现意外编译错误
- Arduino从Txt读取整数
- Arduino C++在构造函数中用参数声明对象数组
- C++ Boost::asio串行通信与Arduino无法写入
- 无法掌握嵌套循环的写作技巧
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 在Arduino中将PWM通道命名为LEDC是否有特定原因
- 'val' Arduino 错误代码之前的预期'('
- 我可以在 Arduino 的库文件夹之外安装库吗?
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- Arduino-C++ bool 不会从 false 变为 true
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- cmsis_compiler.h:在为 Arduino Due 编译 Arduino Tensorflow lite 库
- 用坚实的原则用 arduino 写作