Java&Programming in デブサミ2008レポート
Java開発を楽しみ、プログラミングに誇りを持つ
@IT編集部
平田修
2008/2/28
自動変換とメンテナンス性の間で
Javaは適用範囲が実に広い。意外な部分でJavaプログラミングが使われていることがよくある。ここでは、プログラミング言語の変換モジュールとしてJavaが使われた事例として「VB資産のCurlマイグレーション」というセッションを紹介しよう。
Curlとは簡単にいうと、プログラミング言語の1つでRIA/リッチクライアントの主要技術の1つでもある。Lispのような関数型言語でJavaのようなオブジェクト指向とHTMLのような文章記述が特徴となっている。Curlの詳細は「リッチクライアント&帳票フォーラムのCurl」を参考にしていただきたい。
VB(Visual Basic)のバージョン6のサポートが2008年4月8日で終わってしまうのを契機に、VBからRIA/リッチクライアントへ移行を促す動きがいくつか出てきているが、カール社でもVBからCurlへソースコードを変換するツールを提供し始めた(参考「Visual BasicアプリをWebアプリに自動変換、カール〜リッチクライアント言語「Curl」利用〜」)。VBからCurlへのマイグレーションについて、カール社の親会社である住商情報システム株式会社のCurl事業部 Curlシステム開発部長 岡井道和 氏は次のように付け加える。
住商情報システム株式会社 Curl事業部 Curlシステム開発部長 岡井道和 氏 |
「VBからCurlへのJava製マイグレーションツールは、VBで作成した画面レイアウトやロジックをそのままCurlのクライアントに変換できます。一部、サーバサイドのDBアクセスの部分だけは、ノンコーディングで使用できるJavaモジュールを提供します。従来のクライアント/サーバ型VBアプリケーションと同様に、画面やロジックといったアプリケーションの主要な処理はクライアント側で実行します。しかし、クライアント/サーバ間の通信はHTTP/HTTPSを使ってXMLデータで行われるため、ネットワーク依存度を軽減できるなど利点が多いので、ぜひご活用ください」
マイグレーションツールのソースコード変換部分については、フリープログラマーのきしだなおき氏が説明した。マイグレーションツールは主に、VBの.frmファイルなどをCurlの画面レイアウトのソースコードに変換する画面レイアウト変換ツールと、VBの.frmや.bas、.clsファイルをCurlのロジック部分に変換するロジック変換ツールの2つから構成されるが、きしだ氏はロジック変換ツールの方を住商情報システムと共同開発したという。
きしだなおき 氏 |
「VBから変換してただCurlで動くだけではなく、Curlでメンテナンスがしやすいように、なるべくCurlネイティブの型や制御構造を持つソースコードが生成されるような変換方針でツールを作成しました。実際には、VBにおける引数のByRef処理やGoTo文などをすべてCurl言語に変換することもできましたが、それをやると複雑になりすぎてメンテナンスがしにくくなるので、100パーセントの変換はしていません。変換しきれない特別な部分は開発者/プログラマーの手に委ねます」(きしだ氏)
■ 関連リンク
“速い”コードを書きたくないか?
Javaに限らず、プログラマが最も気を付けることの1つが、実装したプログラムのパフォーマンス/実行速度だろう。コードの書き方1つで劇的に速くなることもあるので、面白いと感じているプログラマも結構多いのではないだろうか。そこで紹介するのが、Seasarファウンデーション 木村聡 氏による講演「Seasarコミッタが教える実行速度が速いコードの書き方」だ。
木村氏はまず、「パフォーマンスチューニングとは何か」について触れ、「パフォーマンスが悪いということは目標となる処理時間を超えるということ」と定義した。そして、自分で計測するための方法としては、AOP(アスペクト指向)を使うことによって、メソッド単位に絞り込んでSystemクラスのcurrentTimeMillisやnanoTimeを使う計測方法が挙げられた。これについて木村氏は、次のように付け加えた。
Seasarファウンデーション 木村聡 氏 |
「メソッド単位で計測するには、きちんとクラスやメソッドを分割しておく、つまりふだんからきれいなコードを書く必要があります。また、パフォーマンスを良くするためにコードを書き直した結果、正しく動作しなくなることもあり得ます。そのため、測定も重要ですがテストも重要となります。プログラムの正確性を犠牲にしてパフォーマンスの向上は許されません。コーディングの優先度としては、1に正しい動作、2にきれいなコード、3にパフォーマンスが速いことです。これは当たり前のことだと思います」
具体的なパフォーマンスチューニングのテクニックとしては、まずJavaに限らずどの言語でも一般的に通用することが挙げられた。頻繁に使う値はキャッシュすること、case文などは頻度の高い順に並べること、ループ文の場合はループの外に出せるものは出して重い処理を繰り返さないこと、答えが分かったところで評価を止めてループを抜けることなどである。これらによって、インデントを浅くしてきれいなコードにできるという効果もある。
Javaならではのテクニックとしては、デモを交えて解説された。例えば、Collection APIはどれを使うべきかという問題について、ArrayListはArrayListはListはインデックスを指定した追加と削除が遅いのでLinkedListを使うべきで、さらにLinkedListはインデックスを指定したgetが遅いので、LinkedListを使用する場合はイテレータを使うべきだとデモの中で解説した。
また、配列とCollection APIを比較した場合、Collection APIの方がgetやcontainsで値を1回で取得できるが、配列はループしないと値を取得できないため処理が重くなるというテクニックが一般論として挙げられた。一方で、配列を使用して速くなる場合があることについても、デモで説明された。
パフォーマンスを良くするためのアプローチとして、木村氏は「1回のコード改変で満足しないこと、憶測で行動しないこと、古い情報を信用しないこと、そして必ず自分で計測することが大切です」と強調した。その例として、Stringクラスでは、startsWithよりもcharAtの方が約6倍も速いというデモも紹介された。「こういったことは『あまり違いがないのでは』という憶測や思い込みがあると確かめられないことだと思います。実際に自分で計測しないと分からないことではないでしょうか」(木村氏)
■ 関連リンク
プログラムを書く前にテストを先に書くことの利点
TDD(テスト駆動開発)をご存じだろうか。従来の開発の流れにおいては、プログラマが仕様を受け取ったら、その仕様を基にすべて実装を行ってから最後にテストを行う。一方TDDは、“少しずつ”をモットーとする。TDDとは、仕様に対して少しずつJUnitなどのテスティングフレームワークを使ってテストのコードを書き、そのテストを実行しながら実装コードの方も少しずつ書いていくという手法だ。本当にそんなことが可能なのか。TDDにどんな利点があるのか。タワーズ・クエスト株式会社 プログラマ兼取締役社長 和田卓人 氏による「デベロッパーテスティング・ライブ − 自信を持ってコードを書くための心・技・体 −」という講演から、その解を探ってみよう。
まず和田氏は、“テスト”というものを、テスト担当者や開発者が行う品質保証のための“QA(Quality Assurance) Testing”、顧客が行ういわゆる「受け入れテスト」と同義の"Customer Testing”、そして、開発者が行う開発促進のための“Developer Testing”の3つに分類した。
タワーズ・クエスト株式会社 プログラマ兼取締役社長 和田卓人 氏 |
「テストというと、品質保証とかバグ/障害といった言葉がつきまとって、問題がはらむものというイメージが強いと思いますが、“Developer Testing”はプログラマの、プログラマによる、プログラマのための、プログラムとしてのテストを書きながら、開発を行っていく手法です」(和田氏)
プログラマーが目指すコードとは、正常に動作するきれいなコードだろう。デベロッパーテスティング/TDDでは、まず正しく動作するコードを書いてから、リファクタリングと呼ばれる技法を用いてそのコードをきれいにしていくアプローチを取る。具体的には、まずテストコードを書き、そのテストを実行して失敗させ、目的の実装コードを書き、書いたテストを成功させ、テストが通るまでリファクタリングを行うという一連のサイクルを繰り返すというものだ。和田氏はこれらの一連のやり方について、コードを書くデモを交えて具体的に解説した。
そして、デベロッパーテスティング/TDDについて、和田氏は最後に次のように付け加えた。「テストを先に書くことによって、不安の持ちようが変わります。テストを考えることは設計を深く考えることであり、また、テストを書くことによって初めて気付く例外条件もあります。テストはプログラマーの不安を取り除くものなのです。そして、テストやTDDはスキルです。才能ではなく数をこなすことによって習得可能ですので、サンプルコードを写すなどして身に付けてみてはいかがでしょうか」
■ 関連リンク
■ デブサミ関連記事
RIA/リッチクライアントの明日はどっちだ? RIA in Developers Summit 2008 レポート 先日開催されたデブサミのセッションの中からRIA/リッチクライアントに関するものを中心にいくつかレポートする 「リッチクライアント & 帳票」フ ォーラム 2008/2/20 |
Javaの最新動向を見極める デブサミ2007 Java イベントレポート 先日開催されたデブサミのセッションの中からJavaに関するものを中心にいくつかレポートする。今年はなんと、あのDukeがリンゴを射抜く? 「Java
Solution」フォーラム 2007/2/22 |
1-2 |
Index | |
Java&Programming in デブサミ2008レポート 「Java開発を楽しみ、プログラミングに誇りを持つ」 |
|
Page1 無線センサーでJavaプログラミングを楽しもう “ステートフル”なら不要なWebプログラミングを減らせる |
|
Page2 自動変換とメンテナンス性の間で “速い”コードを書きたくないか? プログラムを書く前にテストを先に書くことの利点 |
ご意見、ご感想はJava Solution 会議室へどうぞ |
Java Solution全記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|