1 回答
TA貢獻1966條經驗 獲得超4個贊
首先,如果您可以避免寫入數據庫,請絕對選擇。
然后,如果我們有一些關于你試圖保護的內容的上下文,我們可以更好地回答 - 無論是你自己的代碼中的意外更改,還是你把這個對象交給其他你無法控制的外部代碼?
如果它只是你的代碼,那么你可能過度思考了事情,試圖使整個對象不可變,而你實際上不希望對象中的所有內容都是不可變的。某些對象是可以更改的活動狀態。
在這種情況下,我將使用并設置實際的不可變屬性,并將可變屬性保留為可以直接寫入和更改的內容。當您實際打算更改某些屬性時,您沒有對整個對象描述任何原因。Object.defineProperty(){writable: false, configurable: false}Object.freeze()
如果您要將對象傳遞給外部代碼,并且您不希望它們能夠更改您的實際核心對象,那么只需向它們傳遞該對象的副本,而不是原始對象。然后,無論他們對它做了什么,它都不會以任何方式影響你的代碼。然后,您不會嘗試管理某種混合對象,這些混合對象對某些代碼是不可變的,但對某些代碼是可變的,這只是一些混亂。
第二個問題是,如果我堅持使用第一個選項,那么使用工廠重新創建對象會更好嗎?還是添加方法來更改屬性?我對不變性原則有點困惑。
目前還不清楚你試圖通過這里的不變性原則實現什么。這聽起來像是你正試圖遵循某種設計原則,讓事情盡可能地不可變。當然有一些地方可以做到這一點,但就像任何設計原則一樣,它們應該在有意義的時候應用,而不是在沒有意義的時候應用。如果該對象中具有實際的可變狀態,則可能不希望將該狀態放在不可變的對象中。因此,要么將可變狀態存儲在其他位置,要么不要假裝可變對象是不可變的(當它不是時)。就像你有一個包含 10,000 個項目的數組,并且希望更新數組中的一個項目一樣,你不會使數組不可變,然后必須創建數組的全新副本,這樣你就可以修改數組中的一個項目。不,您可以改變現有數組并直接更改一個元素。它的效率要高出一噸。
添加回答
舉報
