「統合開発環境」としてのGrails

Grails以外にも「フレームワーク・ディストリビューション」と呼べるものはいくつかある(JBoss、GlassFish、Geronimo、…)が、それらとGrailsの違いとしてまず明らかなのは、GrailsではGroovyを中心に動的で有機的な統合がなされている、ということである。その他にも、Grailsは開発支援ツールを含んだ、ある意味「統合開発環境」であることも指摘しておきたい。

Grailsには、warやjavadocの生成などを行うための各種のGANTスクリプトが含められている。また、特に強調しておきたいポイントとして、テスト環境が組み込まれていることがある。Grailsにはユニット/統合テスト、DBテスト、Webテスト、開発/試験用DB(HSQLDB)、試験用Servletエンジン(Jetty)などが設定済み/スケルトンジェネレータ込みで含まれている。

なお、これら以外のプロダクトを組み込み、併せて使用することも(苦労の多寡はあるだろうが)可能である。重要なのは、デフォルトとして標準的なセットがあり、とにかくそれで手っ取り早く始められる、ということである。

Grailsによるアジャイル開発

私見だが、Grailsのすべての機能は、アプリケーション開発における「本来不必要なこと」をサボって自動化するためにある。たとえば、設定ファイルを変更したり、RDBとのマッピングや、アプリケーションの再起動、Javaフレームワークの選択、セットアップなどは、本来「必要悪」の部類である。

また、Grailsでは、煩雑な前準備なしで開発を始めることができ、「業務モデルの不可欠な中核部分」に最初から集中して開発を進めていくことができる。

これらの特徴はアジャイルな開発スタイルに適しているといえる。また、データの入力や閲覧を簡易に行うことができるスキャフォルディング機能もこれに貢献している。

モデル駆動開発

GrailsではGroovyの動的なメソッド追加機能やDSLを駆使して、業務モデルを簡潔なGroovyコードとして書き下すことができる。この点は、Ruby on Railsと根本的に異なるところである。RailsではプログラマがSQLでデータベーススキーマを定義し、常にDBテーブルを意識する必要があるが、これに対してGrailsではモデルオブジェクトとその制約をGroovyクラスとして定義していくことが中心であり、テーブル定義はそこから自動生成される。

JavaからダイナミックJavaへ

Ruby on Railsと比較したときに、Grailsの利点は、Java技術の資産を生かせるかどうか、という点に尽きる。ここでいう資産とは、既存ライブラリ/システムはもとより、技術者のスキル、教育投資、開発者/開発企業とのコネクション、ハードウェア/ミドルウェア資産、安定性、実績、性能なども含む。Grailsについて特筆すべきことは、動的言語/動的オブジェクトの世界を、今あるJava技術の上に、実際に動くものとして作りあげたということである。

Rubyはいろいろな面でJavaとは異なる特性を持っており、Javaでの開発を確立してきた企業では、Rubyを採用するために捨てなければならないもの、および新たに作り上げ/獲得していかなければならないものは膨大となる。Rails/Rubyならではの利点は当然あるにせよ、Groovy/Grailsへの移行コストのほうが相対的に少ないといえよう。

Groovyとは

GroovyはJava VM上で動作するスクリプト言語のひとつであり、Javaと完全な相互運用性を持っていることを特徴としている。つまり、すべてのGroovyオブジェクトはバイトコードに変換され、JavaオブジェクトとしてJVM上で直接的に実行され、Javaコードとの間での呼び出しや継承に制限がなく、JavaのすべてのAPIをそのまま利用できる。また、Java 5の機能、特にJava EE 5の開発で必須ともいえるアノテーションに完全対応する、現時点で唯一のJVM上の動的言語でもある。

Groovyの言語としての特徴は、クロージャおよびそれに基づいた直感的なコレクション操作、組み込み型としてBigDecimalを扱える、など多くあるが、一言でいうと、Groovyは、簡潔な表現が可能で、Javaが抱えるいくつかの制約を乗り越えることができる動的な言語である。また、Javaプログラマにとって親和性が高く、極めて容易に習得することできる。

GrailsとGroovyの開発は、開発チーム同士が密接に連絡を取り合いながら行われている(プロジェクトリーダは相互のコミッタでもある)。Grailsの機能の多くはGroovyが提供する機能に基づいており、また逆にGrailsでの開発成果の一部(ExpandoMetaClassなど)はGroovy処理系やライブラリに取り入れられてもいる。