当我想为抽象类编写单元测试(测试常用方法)时,我的问题就开始了,我发现更喜欢组合而不是继承可能会更好(我可以对正在更改“连接”的部分使用模拟)
现在我很难想出一些正确的设计,有人可以帮助我吗?
我的整个代码可以在here找到,但为了简单起见,我将尝试在这里简短地描述它。我有类
PlcData
,它代表我需要的从 PLC 读取的变量的当前状态。 PlcData
代表观察者模式中的主题,我使用不同的类订阅它(我还需要知道确切的属性已更改,这就是为什么PlcData
为我需要观察的每个属性实现“源”接口,我还需要在属性更改时获取所有数据,因为基于我在数据库中搜索的一些其他属性 - 这就是为什么我在任何属性更改时发送整个PlcData
)。我想让 PlcData
的观察者独立于连接(PlcData
如何从 PLC 读取/写入变量)。
这是我的原创设计与抽象
PlcData
:
我想实现这样的目标(很多程序员向我证实这是正确的方法),其中
PlcData
是具体类(我将来也可以使用它的接口)并且连接是 的属性PlcData
:
我的问题是我不知道如何正确实现这一点。 “Connection”的每个具体类将使用一些库,并且这里有很多细节,但它应该处理订阅、读取、写入那些“重要”变量(serialNumber、measuredCurve ... - 在实际代码中我有更多其中,但它们是准确给出的)。但我希望这对于
PlcData
“用户”来说是不可见的,所以他只需调用一些工厂方法PlcDataProvider.getPlcData()
,他将获得具有初始化连接的 PlcData 实例,并且他只需订阅他需要的变量(或写入那些变量和 PlcData
类将处理如何通过“连接”接口将它们发送到 PLC。
我最大的问题
我不知道如何正确地使
Connection
更新PlcData
以及如何在其上写入真正的PLC变量(我真的在这里迷失了方向,我最终为每个属性提供了三种方法(writeSerialNumber、readSerialNumber) 、 subscribeToSerialNumber 和 Connection
需要跟踪 PlcData
)
如何使用某些工厂正确创建 PlcData
您的新设计将需要
PlcData
和 Connection
之间所谓的双边关联,这意味着两者应该相互引用。这很麻烦。
而是使用“用单向替换双向关联”重构。这样只有
PlcData
才会知道 Connection
,反之亦然。
PlcData
负责更新自己的字段。 Connection
不应该知道这一点(它应该只......连接)。这意味着 Connection#update*
方法属于 PlcData
。
PS:这闻起来也更像
Bridge
图案。 Strategy
执行算法,我不确定这里的情况是否如此。