簡體   English   中英

向實例添加數據的最有效方法

[英]Most efficient way to add data to an instance

我有一個類,比如說Person,它是由另一個類/模塊管理的,比如說PersonPool。

我的應用程序中還有另一個模塊,例如模塊M,它希望以最有效的方式將信息與人相關聯。 我考慮了以下替代方案:

  • 向Person添加一個數據成員,該成員可被應用程序的另一部分訪問。 優點是,這可能是最快的方法。 缺點是這是相當侵入性的。 Person不需要了解有關此額外數據的任何信息,並且如果我想將此數據成員與其他模塊隔離開,則需要將其設為私有並將模塊M設為我不喜歡的朋友。
  • 在Person中添加一個“通用”屬性包,其他模塊可以在其中添加其他屬性。 優點是它是非侵入性的(除了帶有屬性袋),而且很容易通過其他模塊添加“屬性”。 缺點是它比直接從Person中直接獲取值要慢得多。
  • 在模塊M中使用一個map / hashmap,該映射將Person(指針,id)映射到我們要存儲的值。 就數據分離而言,這似乎是最好的解決方案,但又慢得多。
  • 給每個人一個唯一的數字,並確保在歷史記錄中沒有兩個人會得到相同的數字(我什至不想讓這些人重復使用一個數字,因為那樣的話,老年人的數據可能會與一個新人)。 然后,外部模塊可以簡單地使用向量將個人的唯一號碼映射到特定數據。 優勢在於,我們不需要使用不需要知道的數據(除了他獨特的nubmer之外)來入侵Person類,而且我們有一種快速的方法來從向量中獲取模塊M的數據。 缺點是,如果刪除並創建很多人,向量可能會變得非常大(因為我們不想重復使用唯一編號)。

在最后一種選擇中,可以通過使用稀疏矢量來解決該問題,但是我不知道稀疏矢量的實現是否非常有效(比map / hashmap更快)。

還有其他方法可以做到這一點嗎? 還是有一種有效的稀疏向量可以解決最后一種選擇的內存問題?

我會用map / hashmap安排解決方案的時間,如果性能足夠好,可以選擇它。 否則,您別無選擇,只能將這些屬性添加到類中,因為這是最有效的方法。

或者,您可以創建一個Person的子類,基本上將所有接口方法轉發到原始類,但添加所需的所有屬性,然后在對M的某些調用期間將原始Person更改為自己修改的那個。

這樣,模塊M將看到子類及其所需的所有屬性,但是所有其他模塊將其視為Person類的實例,並且將無法看到您的自定義屬性。

第一種和第三種是合理的通用技術。 第二個問題是動態編程語言(例如Python和Javascript)如何實現對象的成員數據,因此不要以不可思議的慢速將其拋棄。 第四點與關系數據庫的工作原理相同。 使關系數據庫像拍板一樣運行是可能的,但很困難。

簡而言之,您已經描述了4種廣泛使用的技術。 排除其中任何一種的唯一方法是針對您問題的詳細信息(所需的性能,人員數量,屬性數量,代碼中要執行此操作的模塊數量等)以及相應的度量。

模塊M的另一種可能性是定義一個從Person繼承的類,並添加額外的數據成員。 這里的原理是M的人的觀念與Person的人的觀念不同,因此將M的觀念描述為一個類。 當然,僅當在同一Person對象上運行的所有其他模塊都通過多態性來這樣做時,這才起作用,此外,如果可以使M負責創建對象(也許通過工廠的依賴注入),那么這才起作用。 這是一個很大的“如果”。 甚至更大的一個,如果除了M之外不需要對對象進行任何生命周期的操作,那么您可能可以使用組合繼承或私有繼承優先於公共繼承。 但是,如果模塊N要創建人員集合,然后模塊M想要向其附加額外的數據,則沒有任何用處。

暫無
暫無

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

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