SAD Pattern:Simple API for Datagram
2596 ワード
パターン名
SAD、Simple API for Datagram 意図
ネットワークレポートの解析と処理を分離して、解析コードと処理コードをもう結合しなくなり、拡張しやすくなります.SAX(Simple API for XML)のようにXMLドキュメントの解析と処理を別のユニットに分離します.
動機
ネットワーク通信ソフトウェアの開発においては、常にネットワーク上で受信した各種データの報文を処理します.ある種の報文を受信した後、実行すべき処理ロジックは一つの事柄だけではないかもしれません.処理には新聞文のデータが使用されますので、新聞文を解析する必要があります.新聞の構造は常に動的な部分があります.C言語では、データ構造を定義できませんでした.この構造に直接メッセージを写像できます.参照してください.
考慮を欠いたやり方では、解析と処理を一緒にして、大きな関数として、局部変数や大域変数で解析されたデータを保存して、各種の処理を行います.
拡張しにくい:新しい処理が必要な場合は、解析中に処理コードを複数挿入する必要がある.
処理コードが違っていて、新聞解析のロジックと混ざっていて、本当に何をしたのか分かりにくいです.
エラーが発生しやすい:異なる処理共有解析されたデータは、相互に影響しやすく、エラーを導入する.
もう一つのよくあるやり方はそれぞれの処理によって自分の必要な内容を単独で解析することです.この方式は相対的に集まっていますが、複数の新聞構造を解析する必要があります.解析コードも重複しています.
もっといいデザインが必要です.
シナリオ
SAXはイベントドライバとしてXMLドキュメントの解析と処理を分離しました.参考にすることができます.新聞には内部構造があります.Navigatorモードを使って内部構造を遍歴することができます.また、個々のペイロードの開始と終了時にフィードバックをトリガします.また、レポートの内容に対する各種処理はフィードバック関数として解析過程に登録できます.各処理のために個別のコールバック関数を作成します.
例えば、Navigatorモードで定義される報文構造については、以下のようなAPIが定義され得る.
新聞の解析と新聞の処理のコードは徹底的に分離して、もうつきまとわないでください.
新しい報文処理ロジックを容易に拡張することができる新聞は一回だけ解析してください.
その制約は異なるhandler間にあるべきではないに依存しています.
関連モード
SAXはXMLを扱う類似のモードであるが、最初の出発点はDOMからの性能が悪いことであるが、分離解析と処理の効果もある.
Visitorモードは、階層構造を変化させずに、この階層構造に対する処理を増加させ、正確な処理を正しいノードに自動的に配信するために使用され、データの解析とデータに対する処理も客観的に分離されている.
SAD、Simple API for Datagram 意図
ネットワークレポートの解析と処理を分離して、解析コードと処理コードをもう結合しなくなり、拡張しやすくなります.SAX(Simple API for XML)のようにXMLドキュメントの解析と処理を別のユニットに分離します.
動機
ネットワーク通信ソフトウェアの開発においては、常にネットワーク上で受信した各種データの報文を処理します.ある種の報文を受信した後、実行すべき処理ロジックは一つの事柄だけではないかもしれません.処理には新聞文のデータが使用されますので、新聞文を解析する必要があります.新聞の構造は常に動的な部分があります.C言語では、データ構造を定義できませんでした.この構造に直接メッセージを写像できます.参照してください.
考慮を欠いたやり方では、解析と処理を一緒にして、大きな関数として、局部変数や大域変数で解析されたデータを保存して、各種の処理を行います.
拡張しにくい:新しい処理が必要な場合は、解析中に処理コードを複数挿入する必要がある.
処理コードが違っていて、新聞解析のロジックと混ざっていて、本当に何をしたのか分かりにくいです.
エラーが発生しやすい:異なる処理共有解析されたデータは、相互に影響しやすく、エラーを導入する.
もう一つのよくあるやり方はそれぞれの処理によって自分の必要な内容を単独で解析することです.この方式は相対的に集まっていますが、複数の新聞構造を解析する必要があります.解析コードも重複しています.
もっといいデザインが必要です.
シナリオ
SAXはイベントドライバとしてXMLドキュメントの解析と処理を分離しました.参考にすることができます.新聞には内部構造があります.Navigatorモードを使って内部構造を遍歴することができます.また、個々のペイロードの開始と終了時にフィードバックをトリガします.また、レポートの内容に対する各種処理はフィードバック関数として解析過程に登録できます.各処理のために個別のコールバック関数を作成します.
例えば、Navigatorモードで定義される報文構造については、以下のようなAPIが定義され得る.
typedef void (*MessageHandler)(Message*);
typedef void (*TopLevelPayloadHandler)(TopLevelPayload*);
typedef void (*SecondLevelPayloadHandler)(SecondLevelPayload*);
typedef struct Handler {
MessageHandler start_handle_message;
MessageHandler end_handle_message;
TopLevelPayloadHandler start_handle_toplevel_payload;
TopLevelPayloadHandler end_handle_toplevel_payload;
SecondLevelPayloadHandler start_handle_secondlevel_payload;
SecondLevelPayloadHandler end_handle_secondlevel_payload;
} Handler;
void parse(Message* message, Handler* handlers, int handler_count) {
for(int i=0; istart_handle_message(message);
}
// Message payload, handler, :
//handlers[i]->start_handle_toplevel_payload(toplevel_payload_pointer);
//handlers[i]->end_handle_toplevel_payload(toplevel_payload_pointer);
for(int i=0; iend_handle_message(message);
}
}
それぞれの処理は、自分のハンドルを提供すればいいです.例えば、新聞の内容を印刷できるハンドルや、新聞の操作によってハードウェアを操作するハンダ、新聞のデータを恒久化するハンダなどがあります.Handler handlers[3] = {
DataPrinter,
HardwareManipulator,
DataPersister};
parse(message, handlers, sizeof(handlers)/sizeof(handlers[0]));
効果新聞の解析と新聞の処理のコードは徹底的に分離して、もうつきまとわないでください.
新しい報文処理ロジックを容易に拡張することができる新聞は一回だけ解析してください.
その制約は異なるhandler間にあるべきではないに依存しています.
関連モード
SAXはXMLを扱う類似のモードであるが、最初の出発点はDOMからの性能が悪いことであるが、分離解析と処理の効果もある.
Visitorモードは、階層構造を変化させずに、この階層構造に対する処理を増加させ、正確な処理を正しいノードに自動的に配信するために使用され、データの解析とデータに対する処理も客観的に分離されている.