分ExcelでDSLしてみようそれでは実際にExcelを使った外部DSLっぽいミニフレームワークを作成してみましょう。通常のプログラムやXMLと比較して,DSLの表現方法としてのExcelには次のメリットとデメリットがあります。メリットExcelは表ですので,表形式のデータを見たまま表現できるのが一番のメリットです。セルに色をつけたりコメントも自由自在に書けるなど視覚的な表現力も高いといえます。もとになる仕様書などがそもそもExcelだったりしますので,加工したりコピー&ペーストして利用することも簡単です。デメリットデメリットとしては,変更履歴の差分(diff)が取りにくい点が挙げられます。テキストエディタで編集できない,セルに構文を含んだ長い文字を書くのは辛いなどの問題点もあります。メインフレームの時代より「固定長フォーマット」の電文が利用され続けてきました。現在でも「固定長電文」はデータ交換のメジャーなフォーマットです。Javaには固定長電文を解析する標準APIはありませんので,自作する必要があります。そこで今回は,固定長電文の解析にExcelによるDSLを適用します。例で使用する「固定長電文」は図1のようなものです。読みやすいように改行を入れていますが,実際はすべてつながって1行になります。表1が電文のフォーマットやルールを記述した「電文仕様書」です。電文仕様書には,先頭から8バイトが送信日,9バイト目からの10バイトがユーザ名といった情報や,空白除去,データの型といった変換ルールの仕様などが記載されています。この仕様書をもとに固定長電文を解析してから,目的の処理(たとえば「DBにデータ追加する」など)を行います。両端空白除去(trim⁠)⁠,Integer型に変換Step1:ベタなコードで書いてみるまずはDSLなどを使わずにべたにコードを書くとリスト1のようになります。1で固定長電文のファイルを読み込み,バイト配列に変換しています。バイト配列はそのままでは「配列の一部を取り出す操作」などが面倒です。23で「ByteArray」という自作ユーティリティクラスを使用して,バイト配列を扱いやすくラップしています。parseメソッドはデータの読み込み処理です。データがなくなるまで読み込み処理を繰り返します。4でそれぞれのデータ項目のサイズだけ順番にデータを読み込んでいます。同時にDate型への変換(toDate)や両端文字列の除去(trim⁠)⁠,Integer型への変換(toInteger)を行っています。5で1件分のデータを標準出力へ出力しています。実際に実行してみると図2の出力が得られます。メールアドレス=user5@examples.com}考察1:MessageParserがクラスになっているのはなぜ?MessageParserクラスは連載の前回でもお勧めしたインナークラスとして実装されています。これはバイト配列の現在の読み込み位置である変数indexをフィールドとして保持したいからです。クラス化せずにローカル変数で保持しようとすると,以下のようなコードになるはずです。10;また,別の方法としては自作のByteArrayクラス自体に「現在の読み取り位置」を保持する機構を持たせるという手もあります。その場合,呼び出し元は「何バイト目まで読み込んだのか?」というのは知る必要がなく,「⁠次の8バイトを読み込む」「⁠まだ読み込めるか?」などを問い合わせするだけでよくなり,よりカプセル化が進んだ状態となります。その際クラス名は「ByteArray」ではなく「ByteReader」に,メソッド名「getString」は「readAsString」にするなど,より適切な名前にリファクタリングしたほうがよいでしょう(名前付けに関しては本誌Vol.45の本連載第2回を参照してください⁠)⁠。コードは次のようになるでしょう。reader.readAsString(10);考察2:これからどうする?リスト1はベタに書かれていて,シンプルでわかりやすいコードになっていますね。今回指定された仕様ぐらいであれば,このコードは十分に「良いコード」です。めでたしめでたし......だと話が終わってしまうので,もう少しいろいろな状況を考えてみましょう。今回は電文内のデータ項目は4種類(送信日,ユーザ名,メールアドレス,ポイント)ですが,データ項目が100を超えるような電文はざらにあります。そのような場合,4のデータを読み取る処理が100行以上続くことになり,可読性がかなり悪くなりそうです。仕様書を見ながらプログラムへ反映するのも大変でしょう。Step2では,「⁠Excelの仕様書」を読み込んで,その仕様書に定義されたとおりに処理が実行されるように書き換えてみましょう。DSL著者プロフィール縣俊貴(あがたとしたか)学生時代にMSXで制限された環境でのプログラミングの楽しさを学ぶ。以来,オープンソースのWiki実装「MobWiki」の開発や受託開発などを経て,現在はプロジェクト管理ツール「Backlog」,ドローツール「Cacoo」など,コラボレーション型のWebサービスの企画と製品開発を行う。言うは易く行うは難し。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。