┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
┃ ■┃
●┃● ● オ ブ ジ ェ ク ト 倶 楽 部 ■ ┃
┃ ■ ┃
┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
No.62 2004/09/15
■ I N D E X
┃
┣【Topics】オブジェクト指向開発者向け「お試しセミナー」
┣【プログラミング】JVMで動く新言語、Groovy!!
┗【アンケート】気になるシステム業界 ホントのところ
〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
〇 オブジェクト指向開発者向け「お試しセミナー」
〇 〇━━━━━━━━━━━━━ ━━・
10月よりオブジェクト倶楽部を運営、管理している永和システムマネジメント
では、オブジェクト指向技術者の皆様向けに、教育サービスを開始しします。
その特別企画として、9月29日(水)に「お試しセミナー」を実施します。セミ
ナーの内容は『ユニットテスト技法』です。奮ってご参加ください。
http://po2d.esm.co.jp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【プログラミング】JVMで動く新言語、Groovy!!
はじめに
皆さんこんにちは、今回は各所で話題になっている、JVM上で動く新言語の
Groovy ^1 の紹介をしようと思います。Groovyについては既にインターネット
上のリソースがありますが、今回は筆者の独断と偏見でGroovyの旨みだけを紹
介してみます。
Groovyとはなんだ!?
Groovy...言語の名前にしてはちょっとファンキーなこの言語は、今年の8月31
日で1歳を迎えたまだ新しいオブジェクト指向言語です。冒頭にも書きました
が、GroovyはJVMの上で動作する、Javaで開発されたプログラミング言語です。
Groovyは拡張子が「groovy」などという不条理な長さであることや、java、
javacの代りにgroovy、groovycを使用する点を除くと、見た目はJavaとほぼ同
じ文法でソースを記述することができます。またGroovyは、影響を受けた言語
であるRuby、Python、Smalltalk、Dylanなどから、よりコーディングしやすい
エッセンスを受け継いでいます。更にJavaの世界にはJ2EEに代表される大規模
開発環境が存在します。つまり、GroovyはJavaよりも強力な生産性と、実績の
ある大規模環境を結びつける、接着剤のようなオブジェクト指向言語なのです。
Groovyのクールとトホホ
Groovyの最も素晴しい点は、Javaプログラマが違和感なくダイナミック言語に
移行できるという点です。筆者はRubyやPythonといったLightweight言語も好き
ですが、実際の現場でツール的な役割としてでさえ、自分以外の開発者にすす
めても受け入れてもらうことは困難でした。しかしGroovyはJavaのオブジェク
トをシームレスに扱え、文法もJavaをベースにしているため習熟が容易です。
Javaで用意されている様々な資産を活用することもできるのです。
またGroovyはスクリプトとして実行することもできますし、Javaと同様にコン
パイルして実行することもできます。一度コンパイルしてしまえば、普通の
Javaクラスファイルと同様に実行することができます。もちろんJar化も可能で
す。 ^2
とはいえ、Groovyにも泣き所は山ほどあります。まず第一に若い言語というこ
ともあり、最適化されておらず処理速度が遅いという点です。Javaと比べても
速度的には及びません。次にエラーのトレースがかなり意味不明なため、問題
を追跡するのに非常に苦労します。他にも多数ありますが、ここでは紹介は控
えさせて頂きます:-P
それでもGroovy?
「なんだ、そんなんじゃ使えないじゃん」と思われた方いますか?現状ではそ
の感想はある意味正しいです。しかし今後はどうでしょうか? Groovyは
JSR-241 ^3 において、「The Groovy Programming Language」という名前で登
録されています。現在は「ExpertGroup Formation 」ステージです。数年後は
Groovyが正式にJDKに含まれる日がくるかもしれません。それとは別に、
Groovyの開発はオープンソースで活発に行われており、どんどん改善されてい
ます。
Groovyの「楽」を知る
Groovyは「楽」です。この「楽」には2つの意味があります。1つめは、実現
したいことを「楽」に表現できるという点です。2つめは、「楽」に表現でき
るがゆえに、プログラミング自体も「楽しく」なってきます。Groovyが強く影
響を受けているRubyがプログラマの「楽」を追求した言語ですが、Groovyもし
っかりと「楽」を受け継いでいるのです。最後に少しだけ、Groovyがどれだけ
コードを「楽」に表現できるかを、Javaと比較してみたいと思います。
ループ処理が楽
まず最初は簡単な例で比較してみましょう。List変数に0から99までの数値を格
納したあとに、ひとつひとつ取り出してコンソールに表示します。ここでは
Listを使用しているため、Javaの場合だとプリミティブ型とラッパーオブジェ
クトへの変換が必要です。またループは最初のfor文のように伝統的なインデク
スループと、2つめのループのようにIteratorを使用したループが代表的です。
Java(ループ表現):
List list = new ArrayList();
for (int i=0; i < 100; i++) {
list.add(new Integer(i));
}
for (Iterator i=list.iterator(); i.hasNext(); ) {
Integer index = (Integer) i.next();
System.out.println(index.intValue());
}
一方GroovyはList変数は [] だけで初期化されます。最初のfor文は、「0から
99までの範囲」を意味しており、iに範囲の数値が格納されていきます。Groovy
はプリミティブ型とラッパークラスをautoboxingするため、自身での変換の必
要はありません。2つ目のループでは、listオブジェクトに対して、eachメソ
ッドが実行されています。eachメソッドは {} で括られたクロージャを受け取
り、リストの数だけクロージャを実行します。クロージャは後ほど例を出しま
すが、ここではListの要素全てに対して実行される処理と認識しておいてくだ
さい。
Groovy(ループ表現):
list = []
for (i in 0..99) {
list.add(i)
}
list.each {|index| println(index) }
コード量の差は歴然としていますね。もちろんJavaでも次バージョンのTigerで
は、for文の簡略記法やautoboxingが組込まれているため、今のJavaコードより
は簡潔に記述することができますが、それでもGroovyの簡潔さは群を抜いてい
ます。
Beanを作るのが楽
今度は別のサンプルを見てみます。こちらは一般的なJavaBeanをJavaとGroovy
で表現してみます。Javaの方は内容を格納するインスタンス変数と、
getter/setterをそれぞれ記述しています。見慣れたソースですが、冗長な感
は否めません。
Java(Bean):
public class SampleBean {
private String title;
private String desription;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return desription;
}
public void setDescription() {
this.desription = desription
}
public String getContent() {
return content;
}
public void setContent() {
this.content = content;
}
}
一方Groovyはというと...たったこれだけです。「これでは変数宣言しかして
いないのではないか?」と思われる方もいるでしょう。Groovyではpublicの変
数を宣言すると、自動的にprivateインスタンス変数と、getter/setterを内部
的に作成してくれます。見た目が変数的ですが、実は操作も変数的に操作する
ことができます。obj.field というアクセスをした時には、代入であれば
obj.setField()、参照であればobj.getField()が自動的に呼ばれるようになっ
ています。
Groovy(Bean):
class SampleBean {
String name
String desription
String content
}
Groovy(フィールドへの操作):
bean = new SampleBean()
bean.name = "sample name" //bean.setName("sample name")
println(bean.name) //println(bean.getName())
クロージャが楽
クロージャは、Groovyが参考にしている RubyやSmalltalkではお馴染な概念で
す。簡単に言ってしまうと「手続をカプセル化してオブジェクトとして操作で
きるようにしたもの」です。論より証拠、実際にサンプルを見てみましょう。
Javaのサンプルを見てください。インターフェースClosureを定義して、
ClosureSampleの中で無名クラスとして使用しています。ここでのClosureは
runメソッドを1つだけもったコマンドのようなものと考えてください。
ClosureSample内で、無名クラスを使ってrunメソッドの実装をしてインスタン
スを取得し、実行しています。 ^4
Java(クロージャ):
public class ClosureSample {
interface Closure {
void run(Object o);
}
public static void main(String[] args) {
Closure closure = new Closure() {
public void run(Object o) {
System.out.println("Run closure : " + o);
}
};
closure.run("Hoge");
}
}
同じことをGroovyで表現するとたったこれだけです。Groovyはクロージャを言
語機能として取り入れているため、無名クラスを使わずともクロージャを使用
できます。 ^5 以下の例をご覧ください。ブレースで囲まれた部分がGroovyの
クロージャにあたります。ブレースの次に「|o|」とありますが、これがJava
の例でのClosureインターフェースのrunメソッドの引数にあたります。
Groovy(クロージャ):
class ClosureSample {
public static void main(String[] args) {
closure = {|o| println("Run closure : " + o) }
closure("Hoge")
}
}
Groovyはこのクロージャを様々な場所で使うことができます。標準では
Collectionライブラリには、クロージャを受け取るメソッドが用意されており、
コレクションの要素に対して様々な処理が実行できるようになっています。先
の「list.each」もクロージャを受け取ってリストの要素全てに対してクロージ
ャを実行していることになります。次の例は自分でクロージャを受けとるメソ
ッドを作成した例です。Javaで同様のことを実現しようとすると、やはり無名
クラスを使わなねばならず、ソースコードが見辛くなってしまいます。
closure.groovy(クロージャを使ったメソッド):
def receive(closure) {
println("start closure")
for (i in 0..5) {
closure(i)
}
println("finish closure")
}
recieve {|i| println(i + 10) }
recieve {|i| println(i + 20) }
実行結果:
$ groovy closure.groovy
start closure
10
11
12
13
14
15
finish closure
start closure
20
21
22
23
24
25
finish closure
まとめ
Groovyの言語としての魅力を少しでもわかってもらえましたでしょうか?
Groovyはまだまだ若い言語ですし、これからもどんどん仕様が変るでしょう。
その上で筆者は、「業務でJavaは使うけど、他は特に...」という方に強く
Groovyをお勧めします。是非Groovyの実行環境をダウンロードして、触れてみ
てください。きっとJavaとは違う、プログラミング自体を楽しくする輝きを感
じて頂けるでしょう。日本語でも、Groovyのコミュニティ ^6 やリソース ^7 、
ML ^8 が徐々に増えてきています。興味のある方は是非ご覧ください。オブジ
ェクト倶楽部でもGroovyを今後ともプッシュしていきたいと考えています。
(懸田)
[1] : http://groovy.codehaus.org/
[2] : 動作にはgroovyに関連するjarファイルが必要です
[3] : http://www.jcp.org/en/jsr/detail?id=241
[4] : Commons Collectionsには独自のClosureに対応したコレクションが含ま
れています
[5] : Groovyではインナークラスや無名クラスはまだサポートされていません
[6] : http://groovylab.org/
[7] : http://www.kakutani.com/trans/ociweb/jnbFeb2004.html
[8] : http://groups.yahoo.co.jp/group/groovy-users
______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E005+0+0
普通:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E005+0+1
イマイチ:
http://www.ObjectClub.jp/cgi-bin/question.cgi?E005+0+2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ
今週は「オブジェクト指向(Object-Orinted)という概念があるのを初めて知っ
たのはいつ?」のホントのところ。
15年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+0
10年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+1
5年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+2
3年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+3
1年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+4
半年以上前。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+5
ここ半年以内。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+6
それは秘密です。
http://www.ObjectClub.jp/cgi-bin/question.cgi?Z001+27+7
ちょっと語らせて!
editors@ObjectClub.jp まで詳細を!!
アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「何個のアイコンがデスクトップにありますか?」の結果は公開中。
是非ご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記
こんにちは、編集人です。今年は、天災のようなものが多いですね。それだけ
で刹那的な気分になるわけではありませんが、何が起こるかわからないなァ、
と思うことはあります。何かにつけて我慢することは、日本人の美徳ですが、
ある程度やりたいことはできるうちにやることが大切なのかもしれません。仕
事に関しても遊びに関してもチャンスというものは過ぎ去ってみるとよく見え
るんですから皮肉なものですね。
今週の強引な一言
*** 老い木は曲がらぬ(ことわざ)***
年をとるとつい若い人の意見を聞かずに自分の考えを押し付けてしまいがちで
す。分かっていても、気付くと同じことの繰り返し。だからって柔軟な思考で
いようという努力は怠らないでくださいね。明日のあなたより、今日のあなた
のほうが若いのですから。(さわ)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒http://www.ObjectClub.jp/community/object_ml/help/
〇 免責事項、過去の記事は ⇒http://www.ObjectClub.jp/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://www.ObjectClub.jp/
■ 編集代表:平鍋 健児
Copyright (c)2003-2004 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.