我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,在确定最佳的实现方式以从i2c接口到我的实体获取字节数组缓冲区数据时遇到了一些麻烦。这是一个类似于仪表板的简单应用程序,可以查询智能电池的状态和大约12个不同的寄存器值。然后,它会在一个小窗口小部件或一个较大的“详细信息”窗口中向用户显示数据。我试图避免创建更多的贫血模型,因为我发现自己从早期使用MVVM模式开发时就陷入了困境,并试图打破这种习惯。
程序功能
通过FTDI电缆通过SMBUS(i2c)从SmartBattery电池中检索数据,并将其显示在WPF应用程序中。
当前结构
FTDI
电池
从电池获取的数据为字节数组格式,长度在2到32个字节之间,大小从小到大(请相信我,我知道这很奇怪)。基本上,必须向设备地址(0x0b)发送写命令,并将“命令”作为寄存器(例如,电压为0x09)。使用传递的缓冲区执行读取命令后,缓冲区包含来自电池的数据。
对我来说,保持Ftdi通讯层与应用程序功能无关是很有意义的,因为我可以用i2c代替SPI等(甚至可以与电池以外的其他设备通讯)。因此,我确保该层对与其通信的设备类型一无所知。但是,这给我留下了一个问题:
我应该将电池寄存器的知识放在哪一层?
每个寄存器都有一个地址,长度,单位类型和格式。即
电压
地址:0x09
长度:2个字节
单位/格式:mV
在寄存器中,我想到了以下转换器:
那么,考虑到这一点,我应该如何去做呢?我目前的想法是:
我认为第一种方法会更容易,但是我想将此应用程序作为将来项目的“模型”,并希望在第一时间就将其正确设置。
感谢您的帮助,对史诗般的小说表示歉意。
答案 0 :(得分:0)
使用贫血模型+电池服务。
通过这种方式,您可以通过DI正确地对服务层进行单元测试,并且如前所述,可以使用不同的服务来服务于不同的硬件类型。
更难的问题是将所需的转换放在哪里。问题的一部分是字节数组本身耦合到硬件。我也会考虑将其抽象出来。然后,您的服务可以返回模型知道并可以使用的抽象数据类型,而不必担心它来自何处或真正包含什么。