18章 テーブル駆動方式
moch5oMaki.icon
テーブル駆動方式とは
テーブル駆動方式とは、論理文(ifやcase)を使って情報を検索する代わりに、テーブルの情報を参照するしくみである。
正直、コード見たらなるほどな、と思うけどこういう書き方をこういう呼び方するの知らなかった。
配列やオブジェクトに格納してアクセスするやり方に比べると、つい条件から考えてしまいがちなので、テーブル駆動方式という名前を知ったことで最初からこういうアプローチが意識できるようになるなと思った。引き出しが増えたの嬉しいmoch5oMaki.icon
18.1 テーブル駆動方式の概論
ifの条件分岐で条件部分が長くなって複雑になったJavaのコードの例
こういうのがテーブルを参照する形で書くとすっきりする
条件を列挙するのではなく、条件はデータとして持つ→そのデータを参照する
18.2 テーブル駆動方式の注意点
データの参照方法を適切に選ぶ必要がある
テーブルのエントリを直接参照する方法が適さないデータもある
例えば、9桁の社会保険番号の参照など
下記の中から適切な参照方法を選ぶ
直接アクセス
インデックスアクセス
段階型アクセス
テーブルに何を格納するか
データそのもの
動作や動作を説明するコード
直接アクセステーブル
月の日数の例
1~12月の日数をそのまま格納する
保険料率の例
全てのパターンを網羅して条件を分岐させようとすると大変
各条件に対応したデータを用意してそれを参照する
データ自体もファイルに格納しておけばプログラムを修正しなくても変更が可能になるというメリットも
ブイのメッセージを印刷するプログラムの例
ロジックベース、オブジェクト指向、テーブル駆動の比較
ロジックベースの記述は冗長で保守性が悪い
オブジェクト指向にしたからと言ってロジック部分の冗長さがどうにかなるわけではない
テーブル駆動であれば、各メッセージをプログラムのロジックにハードコーディングする必要がなくなる
メッセージの定義をファイルに格納することも可能
データはロジックより柔軟な傾向にある。メッセージのフォーマットが変更されても、データなら変更しやすい。
継承やポリモーフィズムを使用したからといって、それがいい設計であるとは限らない。
参照キーの補正
直接データを参照してもうまくいかない例(保険料率の計算)
キーを直接使用できるように情報を複製する
キーを直接使用できるように変換する
キーの変換をルーチンとして独立させる
18.3 インデックスアクセステーブル
基本データを使ってインデックステーブルのキーを検索してインデックステーブルから読み取った値を使ってデータを参照する
インデックスを通して参照テーブル(実データ)にアクセスした方が早いよねという話
10000個のエントリを持つインデックスを使用するか、10000個のエントリを持つ参照テーブルを使用するかの選択
18.4 段階型アクセステーブル
テーブルのエントリがここのデータポイントではなく、ある範囲のデータに対して有効であるという考え方に基づいている
それぞれの範囲の上限をテーブルにまとめた後、各範囲の上限値と得点を照合するためのループを作成する
不規則なデータにも対応しやすいという利点がある
この方式を採用するケースは多くないかも?愚直に条件分岐とかでロジック書いた方がいい。
case文で範囲指定できるし、DBでやるのもありかも。
注意点
範囲の終端を正しく処理する→正しく条件が判定されなくなる
逐次探索ではなく二分探索の使用を検討する→範囲の検索なので「準」二分探索に置き換えが可能
段階型アクセスの代わりにインデックスアクセスの仕様を検討する→プログラム内容によっては範囲のデータに対する評価でもインデックスの方が良い場合も
どの方法がうまくいくかは状況によりけりである。
〜最善の解決策を見つけ出そうとするよりも、良い解決策を見つけるための努力をし、大惨事を避けるのがよい
18.5 テーブル参照のその他の例
本書の他の箇所でもテーブル参照の例がある
チェックリスト
複雑なロジックの代替案としてテーブル駆動方式を検討したか
複雑な継承構造の代替案としてテーブル駆動方式を検討したか
テーブルのデータを外部に保存し、実行時にそれを読み取ることで、コードを変更せずにデータを修正することを検討したか
単純なインデックス配列を使ってテーブルに直接アクセスできない場合、コードでインデックスの計算を複製するのではなく、アクセスキーの計算をルーチンとして独立させている
まとめ
テーブルは複雑なロジックや継承構造に変わる手段を提供する。参照テーブルを使うことで単純にできそうか考える。
テーブルを使用するうえで重要となるのは、テーブルにアクセスする方法を決定することである。直接アクセス、インデックスアクセス、段階型アクセスがある。
テーブルを使用するうえでもう一つ重要なのは、テーブルに保存するものを正確に決定することである。