我正在研究RoR應用程序,但這是OOP策略的一般問題。考慮一下存儲多種類型的引用的情況:書籍,文章,演示文稿,書籍章節等。每種類型的引用都是層次結構的一部分,其中常見行爲位於最一般的繼承點上,在數據庫級別,我使用單表繼承。該類型是通過使用select選項設置的,因此可以說我輸入的數據就好像它是一本書,但是後來才意識到它只是一個章節。因此,我通過選擇「Book Chapter」來更改參考類型,然後將更新發布到現有模型/表單。問題是處理這個問題的正確策略是什麼?將對象轉換爲其他類型
一方面,似乎最好轉換數據庫中的現有記錄以避免id耗盡,並可能節省創建/刪除記錄的操作。然而,這往往會使更新策略變得複雜。
另一方面,使用舊對象創建一個新對象(和記錄)來初始化想要保留的值,然後刪除舊對象,似乎更符合一般對象方向。我認爲這在對象空間(堆)方面更有意義,我認爲它更像一般系統的思想。
但是,我還沒有確定這一點,在坐了一會兒之後,我正在向這個社區投放它,看看有什麼「正確」的方式來做到這一點。
我同意。如果你的模型足夠相似以保證單表繼承,那麼這些選項中的任何一個都可能比實際需要的工作方式更多。 – 2009-10-30 18:07:53
也許我應該使用第二個例子。這不僅涉及數據的存儲,還涉及數據的行爲方式。另一個例子是我們爲遊戲創建腳本的位置,記錄表示表達式節點。因此,讓我們說我們有一個Effect類,並且有一些類似於Give和Take的效果,但是GiveMoneyEffects與GiveItemEffects有不同的要求,它們也需要選擇項目。在這種情況下,存在表單行爲更改以及處理時間問題。 什麼是「正確」的事情呢? – adamaig 2009-10-30 19:02:13
@adamaig那麼,正確的做法可能是創建一個不同的子類的新對象。或者,您可以擁有模型檢查的行爲字段。如果您使用Ruby,您可能更願意使用元編程爲運行時的對象賦予它自己的功能。正如@NSD所評論的,正確的做法取決於你的模型的二態性以及你選擇使用的語言/範式。 – deau 2009-10-30 19:42:52