首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用可靠的原则用arduino编写

使用可靠的原则用arduino编写
EN

Stack Overflow用户
提问于 2019-05-31 06:03:02
回答 1查看 71关注 0票数 0

我是一个C程序员,而且我是cpp.for新手,这是我想用S.O.L.I.D方式编写程序的一些可以理解的原因

我想用Arduino写一个面向对象的c++程序。

有classA、classB、ClassC和classD。

  • classA必须从串口获取数据,并将字节数组提供给classB。
  • ClassB进行一些处理,并将另一个字节数组提供给classC
  • classC,使此数组转换为定义的格式,以便正确输出。例如,json
  • classD将此输出通过mqtt

发送

我的问题是

如果我仅仅通过更改一个参数就可以将classA更改为SPI或其他外围设备,我该如何编程SerialPort?(对象或实体应该对扩展开放,但对

  • 关闭这些类相互通信,如果将来我选择xml而不是classC中的json,而不修改其他类,我可以扩展classC?

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

EN

回答 1

Stack Overflow用户

发布于 2019-05-31 06:44:48

嵌入式编程和OOP不是最好的朋友,特别是在像Arduino这样一个非常有限的系统中。在经典的OOP中,这两个问题的答案都是多态性(带有虚函数)。您可以为classA创建一个接口,并在每个派生类中实现以不同方式获取数据。

代码语言:javascript
复制
class DataGatherer {
public:
    virtual char* getData() = 0;
    virtual ~IClassA () = default;
};

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

对于资源较少的解决方案,你可以很容易地将参数映射到一个函数(例如,使用一个简单的switch-case语句),如果这些函数有共同的格式(比如它们返回数据数组或任何你实际需要的东西)。

代码语言:javascript
复制
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();
}

请注意,第一个版本可能在某些时候也需要切换大小写(在这里您决定应该使用哪种输入类型)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56386192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档