我正在编写一个基于Quickfix/N的FIX引擎,它监听交易Executions(ExecutionReport)并将它们保存到数据库中。
如果接收到的消息中不存在该值,则从API请求字段值会抛出FieldNotFoundException。例如,如果帐户不存在,则调用executionReport.Account将抛出异常。
由于某些字段是可选的,因此我必须在获取之前明确检查字段值是否存在。 我有两种可能性:
可能性1:
executionReport.IsSetAccount() ? executionReport.Account : null;
可能性2:
try
{
return executionReport.Account.getValue();
}
catch (Exception e)
{
return null;
}
第一个选项是干净但我发现它很重,第二个可以推广到辅助函数但是它违背了API哲学,我觉得我做错了。
然后我的问题是:
或者我对Protocol / API的理解是完全错误的? 我觉得我没有以正确的方式解决问题。
非常感谢
答案 0 :(得分:3)
你还没有说明为什么你认为那些是不洁净的,所以我不确定你究竟在寻找什么。
我能想到的唯一选择是:
// Both these lines are functionally identical.
executionReport.IsSetField(1)
executionReport.IsSetField(QuickFix.Fields.Tags.Account)
// 1 is the tag for Account.
// The second line just uses the tag enum to get 1
// instead of hardcoding the int.
这样更好吗?
答案 1 :(得分:0)
好的,为了避免编写适配器类或者每次我想使用ExecutionReport字段时都可以检查,我创建了一个扩展类来完成这项工作:
public static class ExecutionReportExtensions
{
public static string AccountValue(this QuickFix.FIX44.ExecutionReport executionReport)
{
if (executionReport.IsSetAccount())
return executionReport.Account.getValue();
return null;
}
然后按如下方式使用它:
executexecutionReport.AccountValue()