次のようなことをしているコードに出くわしました:
Map<String,String> fullNameById = buildMap1(dataSource1);
Map<String,String> nameById = buildMap2(dataSource2);
Map<String,String> nameByFullName = new HashMap<String,String>();
Map<String,String> idByName = new HashMap<String,String>();
Set<String> ids = fullNameById.keySet();
for (String nextId : ids) {
String name = nameById.get(nextId);
String fullName = fullNameById.get(nextId);
nameByFullName.put(fullName, name);
idByName.put(name, nextId);
}
何が起こっているのかを理解するために、私はそれを数分間じっと見つめなければなりませんでした。そのすべてが、id の結合操作と、元のマップの 1 つの反転に相当します。Id、FullName、および Name は常に 1:1:1 であるため、これを単純化する方法が必要であると思われました。また、最初の 2 つのマップが二度と使用されないことも発見しました。また、上記のコードは少し読みにくいことがわかりました。だから私はそれを(私にとって)よりきれいに読めるこのようなものに置き換えることを検討しています
Table<String, String, String> relations = HashBasedTable.create();
addRelationships1(dataSource1, relations);
addRelationships2(dataSource2, relations);
Map<String,String> idByName = relations.column("hasId");
Map<String,String> nameByFullName = relations.column("hasName");
relations = null; // not used hereafter
addRelationships1 で私は
relations.put(id, "hasFullName", fullname);
そして、クエリが値を生成するaddRelationships2で、id
私name
はそうします
relations.put(relations.remove(id,"hasFullName"), "hasName", name);
relations.put(name, "hasId", id);
だから私の質問はこれらです:
- プロセッサやメモリ、または GC の負荷を介して行った作業に、非効率性が潜んでいますか? そうは思いませんが、Table の効率性についてはあまり詳しくありません。Table オブジェクトが の後に GC されないことは承知して
relations = null
います。次のかなり長いコード セクションで、Table オブジェクトが再び使用されないことを伝えたいだけです。 - 効率が上がりましたか?私は自分が持っていることと持っていないことを自分自身に納得させたり、納得させたりし続けています。
- これは読みやすいと思いますか?それとも私が書いたから読みやすいだけですか?
Table
あまり知られていないので、ちょっと心配です。一方、最上位レベルでは、「2 つのソースからデータを収集し、そこからこれら 2 つのマップを作成する」ことが明確に示されています。また、他の 2 つのマップが使用されている (または使用されていない) かどうか、またはどこで使用されているかを疑問に思わないという事実も気に入っています。 - 上記のいずれよりも、よりクリーンで、より速く、より簡単な方法はありますか?
ここで最適化の初期/後期の議論を行わないようにしてください。私はその落とし穴をよく知っています。パフォーマンスを損なうことなく可読性が向上する場合、私は満足しています。パフォーマンスの向上は素晴らしいボーナスです。
注:ここでは変数とメソッドの名前をサニタイズして、ビジネス エリアが議論の邪魔にならないようにしています。同様に、最終的なコードはもちろん生の文字列ではなく定数を使用します。