稽核記錄

一個簡單的變更記錄,旨在易於撰寫且不具侵入性。

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)新增到記錄中。我認為同時新增兩個日期總是很明智的,因為這很容易做到,如果您不新增,以後就無法重新建構它。

我將尋找我手機號碼的腳本留給讀者練習(很明顯,這對我來說太簡單了,不值得寫出來……)。