2012-12-07 41 views
1

我有一個有很多數據的類,它允許對類中的數據進行一些複雜的操作。該類還具有一些允許檢索某些數據的成員函數,即檢索對類中包含的對象實例的引用。所有數據保存在RAM中(沒有支持後臺事務的數據庫)。實例內的數據交易?

現在我想實現一種事務概念,即我想添加一個StartTransaction()方法和一個Rollback()方法。這就是我的問題開始的地方:如何在不改變任何對象引用的情況下將類中的數據恢復到之前的狀態(因爲它們可能在類之外使用)。

因此,所有的克隆概念都沒有用。

有沒有這種方法的解決方案,或者是方法很奇怪,我不應該遵循它。什麼是替代方案?

+0

你在找什麼需要支持事務內存。 [微軟研究](http://research.microsoft.com/en-us/downloads/6cfc842d-1c16-4739-afaf-edb35f544384/default.aspx)項目可能會有所幫助。 – Oded

+0

面向對象編程是關於由外部世界不能訪問的內部狀態描述的對象,但只能從對象內部訪問。當你想對你的對象進行操作時,你可以調用對象的方法,這將導致對象的另一個有效狀態。如果您想實施交易,您必須實施ACID原則。在某種方式下,一種方法通過適當的鎖定在多線程環境中實現它們。如果你想保護你的數據免受多次訪問,你可以鎖定它們。對於回滾,您必須保存保存值。 – Blim

回答

0

您仍然可以使用克隆,但你的代碼需要間接的一個新的水平:

老:

class Data { int SomeValue; } 

class DataInternal { int SomeValue; } 
class Data { DataInternal internal; int SomeValue { get { return internal.SomeValue; } } 

這讓你去耦存儲(DataInternal)外部接口(Data)。您可以克隆和恢復internal,但無需任何人注意。