壊して作ってまた壊して

ひと通り動くものはできたのですが、どうもコードがしっくりきません。状態変数が増え、多段 if で分岐し、個々のクラスが冗長かつ緊張感のない通信をするという、なんともトホホな感じに。そこで、一度組み上がったエンジンをまたバラして設計を検討し直してます。


最大の問題は、状態遷移に伴いキー入力処理と表示処理が重層的に複雑化していく点です。何度も試行錯誤しながら悩んだ結果、入力コンテキストを分割し、リンクトリストで動的に伸び縮みさせることにしました。この構造をひねり出した時はパターンのことなどすっかり忘れていたのですが、基本的な考え方は Decorator パターンと言えそうです。*1


さらに、このリストに Visitor を適用することで検索や候補の表示など様々な処理を実現する予定です。たかだか数個のリストに Visitor を使うのはやり過ぎな気もしますが、個々の処理をカプセル化できるのが魅力的なのと、ダブルディスパッチを本格的に使うのは初めてで良い勉強になりそうなのと、Visitor なしではコンテキストにアクセスするのがやたらめったら大変になるという理由から、まあ良かろうと判断しました。


またしばらくは、試行錯誤の日々になりそうです。

*1:レガシーエンジンでも、単語登録時に Decorator パターンを使っています