BETA

テーブル駆動方式

投稿日:2020-03-24
最終更新:2020-03-24

テーブル駆動方式とは

『論理分(ifやcase)を使って情報を検索する代わりに、テーブルの情報を参照するしくみ』プログラミングテクニックの一種である。』
(Steve, McConnell. 「【電子合本版】Code Complete 第2版 完全なプログラミングを目指して」 第18章)

複雑な条件分岐を実装しようとしたとき、if文やswitch文で実現しようとすると見通しが悪くなることがある(何度も何度もif elseを書く必要がある)。そういった場合にテーブル駆動方式を利用し、データとロジック部分を分離してあげると、変更しやすくかつ効率的な実装が可能である。

例 (作りたいもの)

焼き肉食べ放題(2時間コース)の価格判定プログラムを例に挙げる。

この焼肉店の料金体系は以下のとおりである。

  • スタンダードコースとデラックスコースの2つのコースがあり、選択できるメニューの種類数が異なる。2つのコースで料金体系が異なる
  • 顧客の年齢によって価格が変わる

■スタンダードコース

年齢 価格
~5歳 無料
6~12歳 1500円
13~49歳 3500円
50~59歳 3000円
60~69歳 2700円
70歳~ 2100円

■デラックスコース

年齢 価格
~5歳 無料
6~12歳 2000円
13~49歳 4000円
50~59歳 3500円
60~69歳 3000円
70歳~ 2500円

以上の想定から
「コース」、「年齢」を引数に「価格」を返す価格判定プログラムを作りたい。

例 (コード)

愚直にif文、switch文で書いてしまうと、分岐の数が多くなり見通しが悪くなる。
このような場合にテーブル駆動方式を利用すれば、変更しやすいコードを効率よく実装できる。

  • メインメソッド
public class TableDriven {  
    public static void main(String args[]) {  
        TableDriven tableDriven = new TableDriven();  
        int retPrice;  

        retPrice =   
                tableDriven.calcPrice(Course.valueOf(args[0]), Integer.parseInt(args[1]));  

        System.out.println(retPrice + "円");  

    }  
    private int calcPrice(Course _course, int _age) {  
        int price = 0;  

        //データとロジックを分離させる  
        int[][] priceTable = {  
                {1500, 3500, 3000, 2700, 2100},//スタンダードコースの料金  
                {2000, 4000, 3500, 3000, 2500} //デラックスコースの料金  
        };  

        int[] ageTable = {5, 12, 49, 59, 69};  

        for (int i = 0; i < ageTable.length; i++){  
            if(ageTable[i] < _age) {  
                price = priceTable[_course.ordinal()][i];  
            }  
        }  
        return price;  
}  
  • コースのEnum
    //コースを定義するenum  
    public enum Course {  
        Standard,  
        Deluxe  
    }  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@kadomatsuの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう