バイナリ プロトコルからメッセージをデコードするコードを書いています。各メッセージ タイプには 1 バイトのタイプ ID が割り当てられ、各メッセージにはこのタイプ ID が含まれます。メッセージはすべて、5 つのフィールドで構成される共通のヘッダーで始まります。私の API は単純です。
decoder:decode(Bin :: binary()) -> my_message_type() | {error, binary()}`
私の最初の本能は、メッセージ タイプごとに 1 つのデコード関数を記述してパターン マッチングに大きく依存し、fun 引数でそのメッセージ タイプを完全にデコードすることです。
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_X:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeXField1:32, TypeXFld2:32, TypeXFld3:32>>) ->
#message_x{hdr1=Hdr1, hdr3=Hdr3 ... fld4=TypeXFld3};
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_Y:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeYField1:32, TypeYFld2:16, TypeYFld3:4, TypeYFld4:32
TypeYFld5:64>>) ->
#message_y{hdr1=Hdr1, hdr3=Hdr3 ... fld5=TypeYFld5}.
メッセージの最初の 5 つのフィールドは構造的に同じですが、その後のフィールドはメッセージ タイプごとに異なることに注意してください。
およそ 20 のメッセージ タイプがあるため、上記のような 20 の関数があります。この構造で完全なメッセージを複数回デコードしていますか? 慣用句ですか?関数ヘッダーのメッセージ タイプ フィールドをデコードしてから、メッセージ本文のメッセージ全体をデコードしたほうがよいでしょうか?