asatoの技術的な日常日記

「成長に最大の責任をもつ者は、本人であって組織ではない。自らと組織を成長させるためには何に集中すべきかを、自らに問わなければならない」  非営利組織の経営 - ピーター・ドラッカー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コード進化: EnumMap

「コード変化・進化を考える」のパート2。

今回は、HashMap から EnumMap への進化を例に考えたい。

Java 5.0 からは、列挙を 言語レベルでサポート してくれるようになった。

たとえば、今作ってる ゲーム では、次のような列挙を使って、ゲームのモードを表している。

public enum GameMode {
OPENING,
NORMAL,
// ... その他
GAME_OVER
}


ゲームの設計方法として適切かどうかは微妙だけど、この GameMode にあわせて、ゲーム画面の描画やユーザからのキー入力の扱いを変化させている。たとえば、そのために、GameMode をキーとして使い、値として、キー入力を扱うオブジェクトを Map で登録するようなコードを書いていた。

public class MainPanel extends JPanel {
...

private Map<GameMode, GameModeKeyHandler> keyHandlers =
new HashMap<GameMode, GameModeKeyHandler>();

private void initKeyHandlers() {
keyHandlers.put(GameMode.OPENING, new OpeningModeKeyHandler(openingMenu));
keyHandlers.put(GameMode.NORMAL, new NormalModeKeyHandler(itemMenu));
// ... その他
keyHandlers.put(GameMode.GAME_OVER, new GameOverModeKeyHandler(gameOverMenu));
}
}



で、ここからが本題だけど、昨日気付いたのだけど、enum を Map のキーに使う場合には、EnumMap を使うのが性能的に望ましいということが分かった。

なので上記のコードを HashMap から EnumMap を使うように変更した。

    private Map<GameMode, GameModeKeyHandler> keyHandlers =
new EnumMap<GameMode, GameModeKeyHandler>(GameMode.class);




さて、簡単な例だったけれど、コード変化・進化の観点から軽く分析してみようと思う。

・なぜコードの変化があったか。
-開発者(この場合は僕)がよりよいコーディングについて知らなかったから。性能が出ることが要求されているから。
一般的には、3つのケースが考えられる。
(1)変化がない:開発者がコーディングについて適切な知識を持っていたとすると、HashMap から EnumMap への変化は起こらない。初めから EnumMap を使う。

(2a)変化がある:開発者がコーディングについて適切な知識を持っていなかったので、HashMap から EnumMap への変化が起こる。

(2b)変化がある:「HashMap から EnumMap」の例では当てはまらないけれど、もう一つ考えられる。たとえば、enum の言語機構と EnumMap の導入が同時期でなかった場合。たとえば enum が 5.0 で導入されて EnumMap が 6.0 で導入されると仮定すると、6.0 が出るまでは、開発者は、HashMap を使うことになる。その後、6.0 が出た後に、HashMap から EnumMap へのコード変化が起こる。

・誰がコードの変化を引き起こしたか(開発者? ユーザの要求変化? 環境変化?)。
-開発者。
ただし、微妙ではある。ゲーム開発におけるユーザの暗黙の要求として、FPS (frame per second) が 60 を保つ、というのがある。疑問は「もし、パフォーマンスチューニングをしなくても性能が十分出ていると仮定するなら、HashMap から EnumMap への変化は起こりえたか」という点。

図で書くと以下のような感じ。
hash_enum.png

現実的な観点からみると、パフォーマンスチューニングなしに、大きなゴールである「できるかぎり多くのユーザに遊んでもらいたい」を満たすことはできない。そのため、性能向上は、常に要求される。

・コードの変化により何が変わったか。
-(+)性能向上
-(-)特になし

・デザインの変化・進化といえるか。
-恐らく言えない。クラス内のメソッドやフィールドのみに影響する変更であり、クラス間の構造的な関係を変化されるものではないため。ただし、HashMap の依存から EnumMap への依存の変化はある。


最終的に図で書くとこんな感じか。
hash_enum2.png
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://asatohan.blog77.fc2.com/tb.php/34-b8465348
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。