c++接口设计- IO板底层协议

C++ interface design - IO board lowlevel protocol

本文关键字:协议 IO 接口 c++      更新时间:2023-10-16

我有一个c++类实现io板的低级接口(串行协议),该协议有两个命令来请求板状态(0x01和0x02),并在相同的答案中返回不同的值,如温度和io/状态。第一个命令返回temperature1和gpio 1和2,第二个命令返回temperature2和gpio 3和4。理想情况下,该类的消费者将不知道任何关于内部实现或板协议,所以我要实现底层接口,如

public:    
    int getTemperature1();
    bool getSwitch1();
    bool getSwitch2();
    int getTemperature2();
    bool getSwitch3();
    bool getSwitch4();

,消费者会这样使用它:

board->getTemperature1(); //send command 0x01
board->getSwitch1();//send command 0x01
...
board->getTemperature2();//send command 0x02
board->getSwitch3();//send command 0x02

我看到的问题是所有这些命令在串行接口上触发相同的命令,但我不希望这种情况发生,因为它减慢了应用程序,似乎相当低效。到目前为止,我的解决方案是在底层类中添加updateStatus1()和updateStatus2()方法,并使消费者在读取任何值之前调用此方法:

board->updateStatus1();//send command 0x01
board->getTemperature1(); 
board->getSwitch1();
...
board->updateStatus2();//send command 0x02
board->getTemperature2();
board->getSwitch3();
当然,消费者必须记住,在调用getTemperature1()和getSwitch1()之前,必须调用updateStatus1(), updateStatus2()也是如此。换句话说,消费者必须知道底层接口的内部实现,如果它不记得调用updateStatus方法,可以在不知道错误的情况下读取过时的值。

所以我想问一下,是否有人能想出一个更好的设计,使消费者更容易出错,并使底层类更有效。

也许你可以声明一个BoardStatus结构体,定义一个GetBoardStatus函数返回这个BoardStatus结构体。

GetBoardStatus功能中,您可以合并所有逻辑并检查实际单板状态是否发生了变化。如果实际的董事会状态没有改变,你可以返回它的现金副本,如果它已经改变了,你将在返回之前重新计算它。

这种方式转移了服务器端更新状态的所有责任。