2012-01-05 86 views
1

我想知道設計對象刪除的最佳方法,並觸發刪除許多相關對象。用於刪除具有許多相關對象的對象的OOP設計

這裏是一個例子。有一個僱主類。當僱主被刪除時,其所有工作,發票都將被刪除。當作業被刪除時,其類別選擇也會被刪除。等等。因此,您可以看到在更多對象上刪除Employer觸發器刪除。問題是我必須將刪除依賴對象所需的許多參數傳遞給Employer類中的delete方法。

這裏是一個簡化的例子。想象一下班級的主。當一個主對象被刪除時,對象Dep1,Dep2也必須被刪除。當Dep1被刪除時,Dep11也必須被刪除。如果刪除方法如下所示:Dep1.delete(arg1),Dep2.delete(arg2),Dep11.delete(arg3),則Main上的刪除方法如下所示:Main.delete(arg1,arg2,arg3) 。你看?更多的對象依賴於主 - 更多的參數將需要刪除。

我還必須指出,我有興趣從數據庫中刪除,即刪除其「業務邏輯」意義。我甚至沒有在刪除方法中取消「刪除」對象。

我曾考慮哪些選項:

  • 分組需要刪除到一個單獨的對象參數。我只是不明白所有這些參數如何分組。他們根本沒有屬於一起。例如,如果需要一個Invoice_searcher和Job_searcher - 爲什麼他們會一起在一個對象中?那可能是什麼物體?
  • 將僱主類中的刪除方法中的依賴對象刪除。在這種情況下,如果不顯式調用子對象的刪除方法,會使系統處於不一致的狀態。我想避免這種情況。
+0

對不起,沒有回答你的問題,但Udi Dahan發表了一個關於術語「刪除」的優秀博客:http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ – Kane 2012-01-05 10:00:12

+0

這就是一個有趣的觀點,但並沒有解決我的問題,並討論「不刪除」是在這個問題的背景下。 – 2012-01-05 10:10:34

+2

刪除相關對象需要什麼樣的參數? 'object.deleteYourself()'似乎是一個相當簡單的指令,不需要任何其他輸入。 – MrMisterMan 2012-01-05 10:17:30

回答

1

如果您將參數傳遞給刪除函數,那麼您犯了一個錯誤。

每個對象上你打電話給你刪除功能應該能夠識別其他對象它是父。

我強調對象,因爲它聽起來像是從關係角度來看這件事。

+0

我想這可能是這種情況的正確答案。MrMisterMan在他的評論中也提出了同樣的建議。 – 2012-01-06 05:12:58

0

嘗試使用成分以這樣的方式,一旦你讓員工參考其他少會自動變成引用少....

另一種方式是採取嵌套類的幫助下,如果頂部最封裝的類將得到 unreferenced其他也將被自動得到unreferenced ..(但要確保你沒有拔出嵌套類的參考(說你的內部類)在其他類中)

+0

也許,我應該明確指出,問題是從數據庫中刪除對象,即從業務邏輯域中刪除對象,而不是自己刪除對象。 – 2012-01-05 10:15:24

0

在我的工作線我不需要編寫太多的代碼來刪除,所以請一定要聽取我的建議。這可能有助於瞭解如何創建這些對象/記錄,並以相同的方式處理刪除操作。例如,如果創建的邏輯是這樣的:

  1. 創建僱主
  2. 創建發票
  3. 副發票與僱主

比也許刪除邏輯應該是這樣的:

  1. 刪除與僱主發票的關聯
  2. 刪除發票(或多個)
  3. 刪除僱主

只要實體在一個洽方式創建,刪除它們以相反的順序也應該被證明是洽。

+0

問題是可以在沒有發票的情況下創建僱主,任何時候都可以單獨創建發票,而不是從僱主對象創建發票。 但是刪除必須發生在僱主身上。 我知道應該如何刪除。這裏的問題是刪除實體的參數過多,這些實體取決於主要父(僱主) – 2012-01-05 19:22:03

+0

如果發票是獨立於僱主對象創建的,爲什麼不獨立於僱主對象刪除?我認爲這是要求僱主必須負責刪除,但不是創建發票(和其他子),這使得這與我通常遇到的不同。但是,如果這個要求確實是一個要求,我不認爲除了告訴僱主哪些對象必須被刪除(通過傳遞所有參數)之外,你可以做任何事情。 – 2012-01-06 21:44:57

+0

獨立刪除僱主和發票(使用不同的方法)可能會導致系統處於不一致的狀態(發票不屬於任何僱主) – 2012-01-08 13:37:48

相關問題