良いコ-ドへの道―普通のプログラマのためのステップアップガイド

第5回 メタプログラミング―Excelを使ったDSLを作ろう―その3 Step2:メタ情報をExcelに移動する

この記事を読むのに必要な時間:およそ 2 分

Step2:メタ情報をExcelに移動する

Step2ではメタプログラミングの前準備を行いますリスト2)。ここでは「電文データの読み取り処理」を,Excelから取得した情報をもとに組み立ててみます。両端空白文字の除去やデータ型の変換など「データの変換処理」はStep2では組み込まず,のちほどStep3で取り上げます。

まずでExcel形式の設定ファイルを読み込みます。設定ファイルconfig.xlsの中身は表2のとおりです。DataTableクラスはExcelなどの表形式のデータ構造を保持するSeasar2のクラスで,XlsReaderでファイルから生成します。

このコードのポイントとなるのがです。Step1では4つのデータ項目の数だけ処理を逐一書いていましたが,ここでは「Excelに定義されたデータ項目の数だけ」データを読み取っています。先頭のfor文でExcelの行数分(=定義されたデータ項目数分)処理を繰り返します。ではExcelに定義された「データ項目名」「(データ項目の読み取る)バイト数」を取得し,取得した情報をもとにで電文を読み取ります。最後に「データ項目名」をキーとして,Mapにデータを追加しています。

さて,Step1と比べて劇的に変わった点があります。それはExcelの設定ファイルを変更するだけで「さまざまな電文フォーマットに対応できるようになった」点です。たとえば,データ項目として「年齢」が追加されたとしてもコードの書き換えは発生しません。「年齢」の定義をExcelに1行追加するだけで,プログラムの変更なしに挙動を追加できます。今回の電文は「ユーザ情報」を扱ったものですが,「オーダー情報」「商品マスタ」などの電文解析が発生しても,それらに対応したExcelの設定ファイルを用意すればよく,やはりプログラムの変更は発生しません。

このようにプログラムを書かなくても,メタ情報を用意するだけでプログラムが書かれたかのようになるのがメタプログラミングです。

表2 Excel設定ファイル

Noデータ名称長さ
1送信日8
2ユーザ名10
3メールアドレス20
4ポイント5

リスト2 Step2:メタ情報をExcelに移動したコード

public static void main(String[] args) throws Exception {
    byte[] bytes = FileUtils.readFileToByteArray(
        new File("data.txt"));
    DataTable config = new XlsReader(                ┓
        new File("config.xls")).read().getTable(0);  ┛①
    MessageParser parser = 
        new MessageParser(bytes, config);
    parser.parse();
}

private static class MessageParser {
...
    private DataTable config;

    public MessageParser(byte[] bytes, DataTable config) {
        this.bytes = new ByteArray(bytes);
        this.config = config;
    }

    public void parse() throws Exception {
        while (index < bytes.getLength() - 1) {
            Map<String, Object> record =
                new HashMap<String, Object>();
            for (int i = 0; i < config.getRowSize(); i++) {      ┓
                DataRow row = config.getRow(i);
                String name =                           ┓       |
                    (String) row.getValue("データ名称");  ┛③      |
                int length =                              ┓     |
                    ((BigDecimal) row.getValue("バイト数"))  |    |
                    .intValue();                          ┛④   |
                String value = getString(length);    ―⑤         |
                record.put(name, value);      ―⑥                |
            }                                                    ┛②

            System.out.println(record);
        }
    }
...
}

考察:メタ情報とは何?

メタ情報はメタデータとも言われ,メタなデータ,すなわち「データに関するデータ」のことです。これは「普通のプログラミング」「メタプログラミング」の関係に似ています。今回の例で言うと「電文そのもの」が普通のデータであり,「電文の仕様を表すデータ(Excelに移動した情報)」がメタデータになります。データベースの定義情報やHTMLタグのmetaタグなどはメタデータの一種です。

著者プロフィール

縣俊貴(あがたとしたか)

学生時代にMSXで制限された環境でのプログラミングの楽しさを学ぶ。以来,オープンソースのWiki実装「MobWiki」の開発や受託開発などを経て,現在はプロジェクト管理ツール「Backlog」,ドローツール「Cacoo」など,コラボレーション型のWebサービスの企画と製品開発を行う。また,Webアプリケーションフレームワーク「Cubby」のコミッタを務める。福岡在住。株式会社ヌーラボ所属。

ブログ :http://d.hatena.ne.jp/agt

Twitter:@agata

コメント

コメントの記入