如何通过动态选择FIX4.4/FIX4.3版本简化下述代码?
简化不同FIX版本Heartbeat消息创建的VB.NET代码
原始代码
Select Case FIXV Case "FIX44" Dim _message As QuickFix.FIX44.Heartbeat = New QuickFix.FIX44.Heartbeat _message.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum)) _message.Header.SetField(New MsgType(0)) _message.Validate() Case "FIX43" Dim _message As QuickFix.FIX43.Heartbeat = New QuickFix.FIX43.Heartbeat _message.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum)) _message.Header.SetField(New MsgType(0)) _message.Validate() Case Else End Select
简化方案
当然可以简化,核心是抽离重复的字段设置与校验逻辑,以下是两种实用方案:
方案一:利用基类多态(推荐)
QuickFix各版本的Heartbeat消息均继承自QuickFix.Message基类,可先统一创建实例,再通过基类引用执行通用逻辑:
' VB.NET 14+ 支持switch表达式写法 Dim heartbeatMessage As QuickFix.Message = FIXV switch Case "FIX44" New QuickFix.FIX44.Heartbeat() Case "FIX43" New QuickFix.FIX43.Heartbeat() Case Else Nothing End Switch If heartbeatMessage IsNot Nothing Then heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum)) heartbeatMessage.Header.SetField(New MsgType(0)) heartbeatMessage.Validate() End If
如果是旧版本VB.NET,可改用Select Case先实例化基类对象:
Dim heartbeatMessage As QuickFix.Message = Nothing Select Case FIXV Case "FIX44" heartbeatMessage = New QuickFix.FIX44.Heartbeat() Case "FIX43" heartbeatMessage = New QuickFix.FIX43.Heartbeat() End Select If heartbeatMessage IsNot Nothing Then heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum)) heartbeatMessage.Header.SetField(New MsgType(0)) heartbeatMessage.Validate() End If
方案二:反射动态创建实例
如果后续需要支持更多FIX版本,反射可以避免频繁修改分支判断:
Dim heartbeatFullTypeName = $"QuickFix.{FIXV}.Heartbeat" Dim heartbeatType As Type = Type.GetType(heartbeatFullTypeName) If heartbeatType IsNot Nothing Then Dim heartbeatMessage As QuickFix.Message = DirectCast(Activator.CreateInstance(heartbeatType), QuickFix.Message) heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum)) heartbeatMessage.Header.SetField(New MsgType(0)) heartbeatMessage.Validate() End If
两种方案都能有效消除代码冗余,提升可维护性。
内容的提问来源于stack exchange,提问作者Wayne Graham
相关产品推荐
相关产品推荐

