http://gihyo.jp/dev/serial/01/code/000503
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タグなどはメタデータの一種です。
댓글 없음:
댓글 쓰기