2017-10-11 15 views
0

Quickfix/Nに基づいてFIXエンジンを書き、トランザクションの実行(ExecutionReport)をリッスンしてデータベースに保存しています。QuickFixのオプションフィールドのチェック値があります

値が受信したメッセージに存在しない場合、APIからフィールド値を要求するとFieldNotFoundExceptionがスローされます。例では、アカウントが存在しない場合、executionReport.Accountを呼び出すと例外がスローされます。

一部のフィールドはオプションであるため、取得する前に明示的にフィールド値の有無をチェックする必要があります。 私はそのための二つの可能性ている:

可能性1: executionReport.IsSetAccount() ? executionReport.Account : null;

可能性2:最初のオプションがきれい

try 
     { 
      return executionReport.Account.getValue(); 
     } 
     catch (Exception e) 
     { 
      return null; 

     } 

ですが、私はそれは本当に重い見つけ、第二のに一般化することができますAPIの哲学に反して、私は何かが間違っていると感じています。

その後、私の質問は:

  • は、仕事をする別のきれいな/正しい方法はありますか?
  • また、私のプロトコル/ APIについての私の理解は間違っていますか? 私は正しい方法で問題を起こさないと感じています。

    どうもありがとう

+0

私はあなたが問題があると思う - 一部のフィールドはオプションです。これはFIXプロトコルの機能です。ほぼすべてのFIXメッセージで同じです。取引のさまざまな方法があります... – rupweb

答えて

1

あなたはそれらが汚れていると思うなぜあなたは本当に述べていないので、私はあなたが探している正確に何か分かりません。

私は考えることができる唯一の選択肢はこれです:

// 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. 

は良くあることですか?

+0

それは代替です、それはvalidatoionを一般化する利点を与えます。しかし、APIドキュメントで言及されているように、余分なボイルプレートロジックが必要であり、型の安全性が低いため、推奨されていません。 – Fede

+0

私は2つのオプションがきれいでないとは言わないでしょう、彼らはどちらも仕事をしていて、私はAPIによって提供されるExecutionReportエンティティを適応させる選択肢がありません。しかし、これがポイントです。APIは、getを行う前にフィールドを無条件にチェックするよう強制します。その後、私の2番目の選択肢はこの契約に反するものです。最初の選択肢は上質で「きれい」ですが、フィールドが無くなるほど重いです。何百ものゲッターを持つDTOを持っていて、私がゲッターを呼び出すたびに明白にチェックするようなものです。 – Fede

+0

まあ、私はそこにクリーナーソリューションとは思わない。フィールドはオプションで、そこにない値を取得することはできません。そのため、フィールドの存在を確認する必要があります。その周りには道はない。 –

0

アダプタクラスを記述することややることは、私がExecutionReportフィールドを使用するたびに確認することを回避するには、[OK]を、私は仕事をする拡張クラス作成:

public static class ExecutionReportExtensions 
{ 
    public static string AccountValue(this QuickFix.FIX44.ExecutionReport executionReport) 
    { 
     if (executionReport.IsSetAccount()) 
      return executionReport.Account.getValue(); 
     return null; 
    } 

をそして次のようにそれを使用します:

executexecutionReport.AccountValue()

関連する問題