簡體   English   中英

在服務器 memory 中更新 object 與從數據庫中提取更新后的 object

[英]Updating an object in server memory vs pulling the updated object from the database

我有一些架構/最佳實踐問題

我有一個小object,像這樣

userObjectFactory(data) {
  const {
    id,
    lastActive,
  } = data;

  return Object.freeze({
    id,
    lastActive,
  });
}

現在我必須在 memory 中更新它。 我可以使用更新的值重新創建 object,就像這樣

if(saveToDb().passed === true) {
  const newUser = userObjectFactory(newData)
}

或者,我可以保存到數據庫中,然后拉取更新后的 object。

似乎這兩種方法都將使用相同數量的代碼,但第二種方法會從數據庫中多提取一個,這可以加起來。

這里最好的解決方案是什么?

第二個問題是,如果我堅持第一個選項,使用工廠重新創建 object 會更好嗎? 或者添加一個方法來改變一個屬性? 我對不變性原則有點困惑

首先,如果您可以避免寫入數據庫,請絕對選擇該選項。

然后,如果我們有一些關於您要保護的內容的上下文,我們可以更好地回答 - 無論是您自己的代碼中的意外更改,還是您將此 object 提供給您無法控制的其他外部代碼?

如果它只是您的代碼,那么當您實際上不希望 object 中的所有內容都是不可變的時,您可能會通過嘗試使整個 object 不可變來過度思考。 一些 object 是活動的 state 可以改變。

對於這種情況,我會使用Object.defineProperty()並將實際的不可變屬性設置為{writable: false, configurable: false}並將可變屬性保留為您可以直接寫入和更改的內容。 當您實際打算更改某些屬性時,您沒有描述Object.freeze()整個 object 的理由。

如果您將 object 傳遞給外部代碼,並且您不希望他們能夠更改您的實際核心 object,那么只需將 object 的副本傳遞給他們,而不是原始代碼。 然后,無論他們對它做什么,它都不會以任何方式影響您的代碼。 然后,您不會嘗試管理某種混合 object 對某些代碼是不可變的,但對某些代碼是可變的,這只是有點混亂。

第二個問題是,如果我堅持第一個選項,使用工廠重新創建 object 會更好嗎? 或者添加一個方法來改變一個屬性? 我對不變性原則有點困惑。

目前尚不清楚您要通過此處的不變性原則來實現什么。 聽起來您可能正在嘗試遵循某種設計原則,即盡可能使事物不可變。 當然有這樣的地方,但就像任何設計原則一樣,它們應該在有意義的時候應用,而不是在沒有意義的時候應用。 如果您在 object 中有實際的可變 state,那么您可能不想將 state 放入不可變的 ZA8CFDE6331BD4B666ACZ 中。 因此,要么將可變的 state 存儲在其他地方,要么不要假裝可變的 object 是不可變的(當它不是時)。 就像如果您有一個包含 10,000 項的數組並且您希望更新數組中的一項,您不必使數組不可變,然后必須制作一個全新的數組副本,以便您可以修改數組中的一項大批。 不,您改變現有數組並直接更改一個元素。 它的效率要高得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM