1

要素のマップを保持するコンテナがあります。

class MyContainer{
.....
Map<String,MyElement> elements = new ...
...
}

各要素には name プロパティがあります。マップのキーは要素の名前です。つまり、メソッドの挿入は次のとおりです。

void addElement(MyElement elem){
    elements.put(elem.getName,elem);
 } 

要素名に基づく読み取り操作が多いため、マップ データ構造を使用する必要があります。

問題は、要素の名前の変更をサポートする必要があることです。要素名を変更すると、マップ内の変更が派生する必要があります。(新しいキーで要素を挿入しないと、その要素を見つけることができません)

私は2つのオプションについて考えました:

  1. 名前が変更されたコンテナーを更新する setName メソッドを MyElement クラスに追加します。

  2. setName メソッドを MyElement クラスに追加せず、rename element メソッドをコンテナーに追加します。コンテナーは、マップ内の要素名とキーの両方の更新を担当します。

オプション 1 は、各要素からコンテナーへの参照を維持する必要があることを意味します。(プログラムのこの部分は、メモリ フットプリントを低く維持する必要があります)。

あなたは何を言っていますか?より良いオプションがありますか?

4

4 に答える 4

1

要素の setName メソッドでプロパティ変更通知を起動し、その通知をリッスンしているコンテナー オブジェクトでそれを処理します。

于 2009-05-13T11:32:46.507 に答える
1

まず第一に、 がMyElementなくてもコンテキストで使用できる可能性がある場合MyContainer、オプション 1 はアウトであることに注意してください。

MyContainerMyElementのコードMyElementはマップを介してインスタンスを参照するため、との関係は明らかです。逆は真ではありません: のコードはMyElementを参照する必要はありませんMyContainer。したがって、オプション 2 の方が優れています。

ただし、おそらく、3 番目のハイブリッド オプションを選択することもできます。

  • MyElementrename自身の名前のみを変更するメソッドと、マップ内のオブジェクトを呼び出して新しいキーに移動MyContainerするメソッドがあります。renameMyElement.rename
于 2009-05-13T11:35:00.340 に答える
0

要素がこのコンテナーでのみ使用される場合。

コンテナーに名前変更操作を配置します。

別のプログラマーが誤って要素だけを変更してコンテナーの更新を忘れないように、要素の名前変更メソッドを非公開にします。

于 2009-05-13T11:44:48.357 に答える
0

オプション 2 が最も単純で効率的であるため、これを選択します。明らかにあなたはそれを知っているので、ジレマは何ですか?

別のオプションは、std::string と MyContainer への参照の両方として機能する MyString クラスを作成することです。MyString の変更メソッドは再マッピングを担当し、フットプリントは依然として低くなります。例えば:

class MyString;
class MyElement {
...
   MyString name;
...
};

MyContainer * aContainer = new MyContainer;
new MyElement(MyString("Yaron Cohen",aContainer), ...); /* MyString need to be explicit only upon MyElement construction. takes care of inserting into container. */
...
MyElement * someElement = aContainer["Yaron Cohen"]; /* just std::string for lookup */
someElement->name = "Dana International": /* MyString takes care of remapping */

このオプションは、FirstName、LastName など、複数のキーとコンテナーもサポートすることに注意してください (これらが一意であれば...)。

もう 1 つのオプションは、MyContainer がシングルトンの場合です。

考慮すべきもう1つのことは、名前がどのくらいの頻度で変更されるかということです。

于 2009-05-13T11:55:16.920 に答える