2009-10-30 197 views
1

我正在研究RoR應用程序,但這是OOP策略的一般問題。考慮一下存儲多種類型的引用的情況:書籍,文章,演示文稿,書籍章節等。每種類型的引用都是層次結構的一部分,其中常見行爲位於最一般的繼承點上,在數據庫級別,我使用單表繼承。該類型是通過使用select選項設置的,因此可以說我輸入的數據就好像它是一本書,但是後來才意識到它只是一個章節。因此,我通過選擇「Book Chapter」來更改參考類型,然後將更新發布到現有模型/表單。問題是處理這個問題的正確策略是什麼?將對象轉換爲其他類型

一方面,似乎最好轉換數據庫中的現有記錄以避免id耗盡,並可能節省創建/刪除記錄的操作。然而,這往往會使更新策略變得複雜。

另一方面,使用舊對象創建一個新對象(和記錄)來初始化想要保留的值,然後刪除舊對象,似乎更符合一般對象方向。我認爲這在對象空間(堆)方面更有意義,我認爲它更像一般系統的思想。

但是,我還沒有確定這一點,在坐了一會兒之後,我正在向這個社區投放它,看看有什麼「正確」的方式來做到這一點。

回答

1

優選不可變對象,換句話說:第二種策略。你的對象本身可能不是一成不變的,但減少可變性往往是朝着正確方向邁出的一步。

除此之外,這是更自然的方式。在一般的OOP術語中,沒有辦法改變對象的類型。在你的情況下你可以,但它仍然是一個尷尬和不尋常的事情。另一方面,如果你的對象由相同的(相同的)類表示,並且通過設置高級屬性來改變類型,那麼可以說重新創建對象是矯枉過正的。

儘管如此,減少可變性是一個很好的想法,但是如果你的類已經被設計爲可變的,那麼它可能不值得。 (從語言的角度來看實際上只有一個實際班級的那種特殊情況)

1

您所談論的轉換似乎不能保證新紀錄或新對象。

您引用的每個條目都具有相同的格式。他們是與兄弟姐妹,父母和孩子的文本塊。例如,一章可能有一段文字,帶有父書和孩子尾註。它們僅在數據庫級別上與其類型區分開來,這本身可能是一個字段。

所有你需要的是一個模型來處理這些'元素'的不同取決於它是否被標記爲書或章節等。如果元素被標記爲章節,但沒有父項,例如,您可以在將它保存到數據庫時將其標記爲「書」。

更改元素標記的方式不會更改元素,它只會改變查看方式。只要元素知道如何找到它的子元素,數據將以相同的方式進行計算。就模型而言,它只是一個你擔心的因素。剩下的就是在UI中完成的。

+1

我同意。如果你的模型足夠相似以保證單表繼承,那麼這些選項中的任何一個都可能比實際需要的工作方式更多。 – 2009-10-30 18:07:53

+0

也許我應該使用第二個例子。這不僅涉及數據的存儲,還涉及數據的行爲方式。另一個例子是我們爲遊戲創建腳本的位置,記錄表示表達式節點。因此,讓我們說我們有一個Effect類,並且有一些類似於Give和Take的效果,但是GiveMoneyEffects與GiveItemEffects有不同的要求,它們也需要選擇項目。在這種情況下,存在表單行爲更改以及處理時間問題。 什麼是「正確」的事情呢? – adamaig 2009-10-30 19:02:13

+0

@adamaig那麼,正確的做法可能是創建一個不同的子類的新對象。或者,您可以擁有模型檢查的行爲字段。如果您使用Ruby,您可能更願意使用元編程爲運行時的對象賦予它自己的功能。正如@NSD所評論的,正確的做法取決於你的模型的二態性以及你選擇使用的語言/範式。 – deau 2009-10-30 19:42:52

相關問題