WebObjects/Web 應用程式/開發/審計跟蹤
這在很多地方都會被討論,因此有很多例子。例如,這是我在谷歌上找到的其他人實現的:http://web.archive.org/20050215013412/homepage.mac.com/i_love_my/code.html
然而,除非你瘋了,需要記錄對每個物件的每個更改,否則在許多情況下,“審計跟蹤”的概念最終會成為應用程式特定的。如果可以簡化需求,請務必這樣做。例如,在 www.marketocracy.com 上,我們從未“刪除”基金,我們只是將其標記為已刪除。類似地,在論壇中,我們不會“刪除”我們不想顯示的論壇帖子,我們只是將其“隱藏”。
我們不能刪除基金,因為它們與太多物件交叉連結,但我故意設定了論壇帖子,使其不可刪除,因為我知道總有一天會有人“Oops”(他們確實做到了)。因此,這些表有一個標誌,並且關係被定義為忽略“已刪除”物件。
為了在 www.marketocracy.com 上進行“預測和回憶”,我們已經記錄了每一筆交易,因此在業務邏輯中新增方法以使您可以“時間旅行”到任何時間點非常容易。也就是說,交易會為您的賬戶新增股票,同時從您的現金中扣除(反之亦然)。因此,在任何時間點的任何頭寸上的股票都是 sum(trade.shares where date < desired time)。因此,我們能夠避免對審計跟蹤的需求,因為我們已經有了一個“會計模型”,其中每次操作都被記錄為交易。事實上,如果我必須重新做 Marketocracy,我可能會將其實現為一個雙重記賬系統。
如果我要記錄對每個物件的每個更改,一些典型的提示是,如果您子類化 EOEditingContext,那麼在任何 saveChanges() 操作之前,您可以獲得已插入/刪除/更改的物件列表(您必須先呼叫 processRecentChanges())。如果我要設計這個,我會讓我的所有 EOF 物件都有一個共同的超類/介面,它實現了類似於
auditTrailChanged() auditTrailInsert() auditTrailDelete()
然後,我可以逐個類地決定該怎麼做。這可能包括插入額外的物件等。例如,一個物件可以將其自己與快照進行比較,如果它已更改,它可以將舊值和新值記錄到一個通用物件中,該物件儲存 AuditTrail(類名,物件的 主鍵,使用者名稱,時間戳,屬性,舊值(字串),新值(字串)。
在虛擬碼中
override saveChanges()
self.processRecentChanges()
foreach obj (self.changedObjects)
obj.auditTrailChanged()
foreach obj (self.insertedObjects)
obj.auditTrailChanged()
foreach obj (self.deletedObjects)
obj.auditTrailChanged()
super.saveChanges()