0

一般的な OO 言語 (C++、C#、Java など) では、文字列 ID を持つオブジェクトのマップがあり、同じ ID が相対オブジェクトのキーでもあります。

class Foo(){
    Foo(string id){this.id = id;}
    string id;
    string otherProperty;
}
map<string,Foo> foos;

今私がしたいオブジェクトを追加したい場合

map.add("myFirstID", new Foo("myFirstID"));
map.add("mySecondID", new Foo("mySecondID"));

私は文字列を繰り返すのが好きではありません.最悪になるだけです.

列挙型を使用できません (C++ などの一部の言語では、文字列に簡単に変換できないため、列挙型が必要です)

唯一のオプションはカスケードのようです

const string MY_FIRST_ID = "myFirstID";
const string MY_SECOND_ID = "mySecondID";

それまで

foos.add(MY_FIRST_ID, new Foo(MY_FIRST_ID));

このソリューションはより優れていますが、それでも非常に冗長であり、同じクラスにはまだいくつかの結合があり、値を強制することはありません ( enum のように);

より良いパターンを考えることができますか?

PS: 別の解決策は、enum のみをキーとして使用し、文字列を単純なフィールドとして配置することです。しかし、これには Foo と FooManager (foo インスタンスをインスタンス化するクラス) の間に高い結合を追加する必要があります

4

2 に答える 2

0

C# では、次のようなことができます。

string foo;
map.add(foo = "myFirstID", new Foo(foo));

Java または C++ で同じことができるかどうかはわかりませんが、それは良い出発点です。

于 2013-06-26T14:10:37.327 に答える
0

あなたはいつもあなたのことをすることができました

var f = new Foo("myFirstID")

そして、

map.add(f.id, f);

オブジェクト foo の一意性を提供するためだけにそのキーが必要な場合は、C# と Java の両方で利用できるハッシュセット コレクションを調べてください。IEqualityComparer を提供すると、foo オブジェクトを追加および削除できます。これは、文字列アクセサーを使用してハッシュセットにアクセスする必要がない場合の解決策になります。

于 2013-06-26T14:07:18.330 に答える