0

我有一个使用 tx 中断传输数据的 USART 类。现在我想创建一个使用 DMA 传输数据的变体。你更喜欢什么:

  • 使用继承创建两个 USART 子类,例如 ISRUSART 和 DMAUSART?

或者

  • 只需在代码中实现变体检查。让用户在构造函数中指定是否应启用 dma,然后在代码中执行检查以决定做什么(启用中断或加载 dma)?
4

1 回答 1

2

这个不能随便回答。与许多设计决策一样,这是一个“魔鬼在细节中”的案例。所以我在这里的回答不是“使用解决方案 A”或“使用解决方案 B”,而是“你需要看什么来决定走哪条路”——因为这不仅能帮助你直接给出“您应该选择答案 A”,因为它会引导您完成整个过程,并且您也可以将此过程用于未来的设计决策。

主要问题是:

  1. 代码有何不同?

  2. 它将如何使用?

  3. 一种解决方案比另一种解决方案有什么好处?

  4. 一种解决方案相对于另一种解决方案的缺点是什么?

你是唯一能回答这类问题的人,因为我们没有你的代码,也不知道你正在使用的硬件。

为了澄清以上几点:

如果“带 DMA”和“不带 DMA”之间的代码差异非常小,并且可以在正确的位置添加几个 if,那么这可能是正确的解决方案。另一方面,如果有很多地方完全不同,那么显然这是一个很好的论据,可以将代码拆分以使其更清晰。

如何使用代码也是设计的一个关键问题。您需要确定 DMA 与中断选择的位置和方式,以及放置位置。它是一个工厂函数,然后从class BaseSerial. 还有可能

“优点与缺点”可能相当明显。但是,如果不知道您的代码目前是什么样的,以及会有什么不同,很难说每个选择的得失。

一般来说,拥有一个公共接口/基类,然后是派生类似乎是一个合理的解决方案。但是,如果它做得不对,那么这至少会像使用“更基本”的方法并拥有两组代码一样令人困惑和复杂。

当然,还必须考虑性能。如果添加额外的层(实际上是在代码中生成的,而不是优化出来的),那么这可能会影响设备的整体性能,就像“不必要的 if/else”语句一样。同样,如果不了解实际设计的细节,也很难从性能角度说哪种解决方案更好。

用您认为正确的解决方案进行试验和制作原型可能是一个好主意,看看它的“外观”和“感觉”如何,如果它可能是正确的,那就去做吧。如果它“感觉不对”,那就回去看看另一种解决方案。重复直到你想出一个好的解决方案,或者因为时间不多而被迫选择最不坏的解决方案......

于 2014-01-29T08:32:35.520 回答