稽核記錄
一個簡單的變更記錄,旨在易於撰寫且不具侵入性。
2004 年 3 月 7 日
這是 進一步的企業應用程式架構開發 寫作的一部分,我在 2000 年代中期進行。遺憾的是,自此以後太多其他事情吸引了我的注意力,所以我沒有時間進一步研究它們,我也看不到在可預見的未來有太多時間。因此,這份材料很大程度上是草稿形式,在我能夠找到時間再次研究它之前,我不會進行任何更正或更新。
運作方式
稽核記錄是最簡單的,但也是追蹤時間資訊最有效的方式之一。其理念是,每當發生任何重大事件時,您都會寫下一些記錄,指出發生了什麼事以及發生時間。
稽核記錄可以採用許多實體形式。最常見的形式是檔案。然而,資料庫表格也可以作為一個很好的稽核記錄。如果您使用檔案,您需要一個格式。ASCII 形式有助於在沒有特殊軟體的情況下讓人類可以閱讀。如果它是一個簡單的表格結構,那麼分隔符號分隔的文字簡單又有效。更複雜的結構可以由 XML 很好地處理。
稽核記錄 容易撰寫,但更難閱讀,特別是當它變大時。偶爾的臨時讀取可以用眼睛和簡單的文字處理工具來完成。更複雜或重複性的任務可以用腳本自動化。許多腳本語言非常適合處理文字檔案。如果您使用資料庫表格,您可以儲存 SQL 腳本來取得資訊。
當您使用 稽核記錄 時,您應該總是考慮寫出實際日期和記錄日期。它們很容易產生,即使它們在 99% 的時間裡可能是相同的,但 1% 可以拯救您的資料。在您這樣做時,請記住記錄日期始終是目前的處理日期。
何時使用
稽核記錄 的優點在於其簡潔性。當您將 稽核記錄 與其他模式(例如 時間屬性 和 時間物件)相比較時,您很快就會發現這些替代方案會為物件模型增加許多複雜性,儘管它們通常比在各處使用 效力 更能隱藏這種複雜性。
但是處理 稽核記錄 的困難性就是它的限制。如果您每週根據歷史資料的組合製作帳單,那麼所有用於分析記錄的程式碼都會很慢且難以維護。因此,一切都取決於時間資訊的存取與您的常規軟體程序整合得有多緊密。整合得越緊密,稽核記錄 就越不實用。
請記住,您可以在模型的某些部分使用 稽核記錄,在其他地方使用其他模式。您也可以將 稽核記錄 用於一個時間維度,並將不同的模式用於另一個維度。因此,您可以使用 時間屬性 處理屬性的實際時間歷程,並使用 稽核記錄 處理記錄歷程。
範例(Java)
一個簡單的 稽核記錄 確實可以非常簡單。
class Customer...
private String phone; public String getPhone() { return (phone == null) ? "none" : phone;} public void setPhone(String arg, MfDate changeDate) { log (changeDate, this, "change of phone", phone, arg); phone = arg; } public void setPhone(String arg) { setPhone(arg, MfDate.today()); } private static void log (MfDate validDate, Customer customer, String description, Object oldValue, Object newValue) { try { logfile().write(validDate.toString() + customer.name() + "\t" + description + "\t" + oldValue + "\t" + newValue + "\t" + MfDate.today() + "\n"); logfile().flush(); } catch (IOException e) {throw new ApplicationException ("Unable to write to log");} }
請注意,即使設定方法只使用實際時間,我也將記錄日期(MfDate.today
)新增到記錄中。我認為同時新增兩個日期總是很明智的,因為這很容易做到,如果您不新增,以後就無法重新建構它。
我將尋找我手機號碼的腳本留給讀者練習(很明顯,這對我來說太簡單了,不值得寫出來……)。