web-dev-qa-db-ja.com

「外部」オブジェクトIDの操作

プログラムのユーザー(必ずしも人間ではなく、外部エージェントのみ)が、特定の「外部」識別子を持つクラスのオブジェクトを参照して、オブジェクトを作成、変更、および削除できる必要があるという状況によく遭遇しました。この識別子は、たとえば整数または文字列にすることができます。引数として文字列であると仮定します。

これらのIDはどこに保存する必要がありますか?

明確にさせてください。プログラムが特定の識別子を対応する実際のオブジェクトに「リンク」するには、IDをキーとして、対応するオブジェクトを値として持つ連想コンテナが必要です。これにより、対数アクセス時間が提供されます。

ここで、このクラスのいくつかのメソッドが識別子にアクセスする必要があるとします。この場合、識別子はクラスのフィールドである必要がありますか?これは明らかな解決策のようです。しかし問題は、識別子が重複していることです。連想コンテナのキーとして、および各インスタンスのフィールドとして。これは、ストレージの必要性が2倍になり、「管理タスク」が重複することを意味します(つまり、新しいオブジェクトを連想コンテナに追加する場合、キーとフィールドの両方として識別子を指定する必要があります)。

この問題を克服する一般的な方法はありますか? (または私は何もしないで大騒ぎしていますか?)1つの代替案は、連想コンテナにキーとしてIDフィールドへのreferencesを保持させることです。しかし、私はそれを行う方法を知りません。

たとえば、C++では、クラスを考えます

class MyClass {
public:
    std::string ID;
    MyClass(string id) : ID(id) {}
}

次に、std::map<std::string, MyClass>を格納するのが簡単な方法です。 std::reference_wrapperを使用してIDへの参照を保存しようとしましたが、operator<reference_wrappersで定義されていないため、mapの順序が機能しません:

int main() {
    std::map<reference_wrapper<std::string>, MyClass> myInstances; // error
    MyClass obj("Bob");
    myInstances.insert({obj.ID, obj});
}

これを行う方法はありますか?それとも不必要に複雑ですか?


Pythonでは、私はこれを信じています

class MyClass:
    def __init__(self, ID: str):
        self.ID = ID


myInstances = {}
obj = MyClass("Bob")
myInstances[obj.ID] = obj

myInstances[obj.ID]識別子(Pythonオブジェクト識別子など)とself.ID識別子の両方が同じ文字列を指すため、追加のメモリは必要ありません。 )。

5
Anakhand

この問題を克服する一般的な方法はありますか? (または私は何も大騒ぎしていますか?)

はい、あなたはこれについてあまりにも心配しています。

つまり、データを複製しています。十分なRAM=が利用可能である限り、これは大したことではありません。IDのコピーをコレクション内のキーとして保持し、オブジェクト自体のフィールドとして保持してください。

このような最適化は、CPU使用率に関連するパフォーマンスの問題、または使用可能なディスクの容量、またはRAM storage —であり、ここでのキーは測定パフォーマンスの問題。

これは時期尚早の最適化のように聞こえます。実装と保守が最も簡単なソリューションを選びましょう。

4
Greg Burghardt