2008-08-14 55 views
6

有沒有人推薦過一種設計模式來獲取二進制數據文件,將其中的一部分解析成對象並將結果數據存儲到數據庫中?解析二進制文件數據和存儲在數據庫中的設計模式

我認爲可以使用類似的模式來獲取XML或製表符分隔的文件並將其解析爲代表性的對象。

一個常見的數據結構將包括:

(報頭)(DataElement1)(DataElement1SubData1)(DataElement1SubData2)(DataElement2)(DataElement2SubData1)(DataElement2SubData2)(EOF)

我認爲一個良好的設計將包括一種方法來根據文件類型或包含在標題中的一些定義的元數據來更改解析定義。所以Factory Pattern將成爲解析器部分整體設計的一部分。

回答

21
  1. 只寫你的文件分析器,使用任何技術來介意
  2. 編寫大量的單元測試它,以確保您所有的邊緣案件涉及

一旦你做到了這一點,你實際上會對問題/解決方案有一個合理的想法。

現在,你只是有理論在你的腦海中浮動,其中大部分將被誤導。

第3步:無情地重構。你的目標應該是刪除你的代碼的大約一半

你會發現你的代碼在最後將或者類似於現有的設計模式,或者你將創建一個新的代碼。然後,您將有資格回答這個問題:-)

1

戰略模式可能是你想看的一個。策略是文件解析算法。

然後你想要一個單獨的數據庫插入策略。

4

我完全同意Orion Edwards,通常是我解決問題的方式;但最近我開始看到一些瘋狂的模式(!)。

對於使用一些builder(或factory)創建的每部分數據更復雜的任務,我通常使用類似的interpreter(或strategy)。

對於流數據,整個解析器看起來像adapter,從流對象適配到對象流(通常只是一個隊列)。

對於您的示例,可能會有一個針對內部使用內部數據元素的構建器(由解釋器提供)的完整數據結構(從頭到EOF)的構建器。一旦遇到EOF,就會發射一個對象。

但是,某些工廠函數的switch語句中創建的對象可能是許多較小任務的最簡單方法。另外,我喜歡保持我的數據對象不變,因爲你永遠不知道什麼時候有人將併發性推下你的喉嚨:)

1

使用Lex和YACC。除非您專門將這個主題用於未來十年,否則每次都會生成更好更快的代碼。