我的任务是维护和更新一个库,它允许计算机在硬件设备上发送命令,然后接收其响应。目前代码的设置方式是设备可以接收的每个可能的命令都是通过自己的功能发送的。代码重复无处不在; DRY倡导者最糟糕的噩梦。如何在不增加其他地方的复杂性的情况下降低库中的复杂度?
显然有很多改进的机会。问题是每个命令有不同的有效载荷。目前,要作为有效载荷的数据以参数的形式传递给每个命令函数。如果不将复杂性推到一个称为图书馆的水平,就很难合并功能。
当收到来自设备的响应时,其数据被放入一个完全负责保存这些数据的类的对象中,但它们什么也不做。有数百个这样做的课程。这些对象随后用于通过应用层访问返回的数据。
我的目标:
Throughly减少代码的重复
维持在应用层
复杂的similiar水平更轻松地添加新的命令
我的想法:
有无一个函数发送一个命令,另一个接收函数(接收函数在响应时自动调用检测到来自设备的电子邮件)。有一个结构体,它保存所有将被传递给发送函数并由接收函数返回的命令/响应数据。由于每个命令都有相应的枚举值,因此需要一个switch语句来设置用于发送的任何命令特定数据。
我的想法是最好的办法吗?有我可以在这里使用的设计模式吗?我看了看,但看起来并不符合我的需求。
在此先感谢! (如果需要澄清,请让我知道)
感谢您的输入。我绝对同意,无论我最终做什么,我都不想增加客户的复杂性。你所描述的古代所用的方法与我所提出的方法很接近。 case语句将用于设置发送到设备的有效负载。 您的设备调度想法是我一直在考虑的事情。我不一定喜欢大喇叭阵列的想法(设置可能很麻烦),但是看起来我最终会得到一个大鸣喇叭的SOMETHING,无论我的方法如何。 – Hojdra 2010-02-24 19:17:13
您实际上可以通过旧式'case'调度方法获得一些代码共享...但它涉及到使用goto。这不是大多数人想要(甚至应该)做的事情。 – 2010-02-24 20:02:54
哈哈,不,我宁愿不要被迪克斯特拉的鬼魂困扰:)。我一直在想你的建议。正如你所说,我目前的想法是,每个从基类继承的命令都有一个类。每个类都有一个SendCommand和HandleResponse方法。该类还将封装发送该命令所需的所有数据以及响应该命令而收到的任何数据。该库已经使用函数映射来决定在收到响应时要调用哪个响应函数,因此不会有太大的变化。 – Hojdra 2010-02-24 20:14:35