冗長は危険な兆し

ゲーム作成中に次の様なものが現れた。

  • クラスと優先度のペアが二つ。クラスはそれぞれ別の物
  • 必要に応じてソートを行いたい

最初に取り組んだのは、それぞれのクラスを入れられるようにするために、ジェネリクスを用いてペアクラスを作成した。
このペアクラスにComparableを実装し、ソート可能にした後、このペアクラスを操作するためのリストを作成した。
ここまでは良かったが、問題なのはこのリストから要素を削除する可能性があるのだ。しかも、削除する際には優先度は必要ない(というか、削除側が知っておく必要がない)
リストからのremoveのために、最低でもequalsを実装する必要があったわけだが、この実装では対称性・推移性が満たせないものとなってしまった。


明らかにこれはまずい。これが完成した時点でこれらのクラスはかなり冗長な物となっていた。

そこで、基本に立ち戻ってそれぞれのクラスにComparableを実装することにした。優先度というフィールドが一つ増えたが、自然な振る舞いをするようになった。

プログラムの基本は単純(Simple)で明快(Clear)。自分の組んでいる物はComplexではないかと自問して先に進めよう。


なお、リファクタリングの結果、先に出てきたジェネリクスを用いたクラス群は全て消滅した事をお伝えしておく。*1

*1:ジェネリクスの知識レベルが1くらいあがったけどね!