1 回答

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