JRuby on Rails:Javaのパワー、Ruby onRailsのシンプルさ

関数型プログラミングとメタプログラミングを強力にサポートする、フル機能のオブジェクト指向動的(スクリプト)言語であるRubyは、その柔軟性と開発の容易さで最近注目を集めています。Ruby用のJVMベースのインタープリターであるJRubyは、Ruby言語の使いやすさと、Javaライブラリーとの完全な統合を含む強力なJVMでの実行を組み合わせたものです。

このトピックに関する前回のJavaWorldの記事(「JRubyfor the Java World」)以来、JRubyにはいくつかのエキサイティングな開発がありました。 Sun Microsystemsは、JVMでのRubyのサポートの兆候として、2人の主要なJRuby開発者であるCharlesNutterとThomasE.Eneboを採用しました。 Java Platform、Standard Edition 6(Java SE 6)がリリースされ、動的言語のインタープリターをプラグインするための新しい標準APIが追加されました。 Java 7 VMが、新しい「動的呼び出し」バイトコードと実行時のクラス定義のホットスワップを使用して動的言語を直接サポートする計画が固まっています。一方、JRubyチームはRuby on Railsを幅広くサポートするバージョン0.9.2をリリースしました。2月に予定されているJRubyの次の大きなリリースには、Ruby onRailsの完全なサポートが含まれます。

Ruby on Railsは、Ruby言語に基づいて構築された使いやすいが強力なWebフレームワークであり、特にWeb 2.0の世界で、データベースを利用した新しいWebアプリケーションで急速に人気を博しています。Railsとも呼ばれるRubyon Railsの詳細については、他の場所で紹介します。プロジェクトはまだ3年しか経っていませんが、多くの記事や本が書かれており、そのドキュメントはオープンソースプロジェクトとしては傑出しています(Ruby on Rails Webサイトを参照)。同様に、JRubyの紹介については、以前の記事を参照してください。

この記事では、RailsとJavaの関係を調べます。RailsとJavaWebフレームワークを比較し、JRubyでRailsを実行する利点を説明し、Java開発者(Railsを使用しない人でも)がこの革新的なフレームワークから学ぶことができるいくつかの教訓を確認します。

パワーとシンプルさ

Railsは、Webアプリケーションの開発を大幅にスピードアップして簡素化しますが、特にハイエンドのエンタープライズ向け機能では、未成熟なイメージに悩まされています。

一方、仮想マシン、ライブラリ、およびアプリケーションサーバーを備えたJavaプラットフォームは、速度、安定性、および機能が向上しており、一般にハイエンドサーバーアプリケーションの主要なプラットフォームと見なされています。それでも、Java言語に関連付けられている限り、Javaプラットフォームは、新しい言語の人気が高まるにつれて遅れるリスクがあります。

JRubyは、これらすべてのテクノロジーの補完的な強みを結び付け、RubyとRailsの両方の人気を高めると同時に、Javaプラットフォームに非Java言語の実行における新しい役割を与えます。

Rails:Javaフレームワークが向かっているところ

Java開発者にとって、Railsは、Java Webフレームワークの進化におけるトレンドの自然な集大成のように見えます。つまり、不要なコードが減り、抽象化とダイナミズムが増し、すぐに使える機能が充実しています。

設定より規約

Java Platform、Enterprise Edition(Java EE)の初期バージョンでは、各コンポーネントに広範な構成とコードが必要でした。たとえば、エンタープライズJavaBeansには、Beanごとに複数のソースコードとXML構成ファイルがありました。この複雑さにより、EJBは大規模な開発の代名詞になり、最終的には、冗長性と構成を最小限に抑えたPOJO(プレーンオールドJavaオブジェクト)Beanを目的としたEJB3で180度回転しました。それでも、重量級のJava EEアプリケーションでは、開発者が複数のソフトウェア層(GUI、ビジネスロジック、永続性)にわたって同じビジネスオブジェクトを表現するコードを開発する必要があります。次に、レイヤー間の冗長性と類似性にもかかわらず、開発者はレイヤーを構成ファイルと一緒に接着する必要があります。対照的に、新しいJavaWebフレームワークであるSeamとSpringは、構成とコードがはるかに少ないビジネスオブジェクトを公開します。

Javaフレームワークも、Webアプリケーションの層全体でスタックの標準化と統合に向けて動いています。初期の頃、Java Webアプリケーション開発者は、サーブレットからのHTML出力を手動でコーディングし、独自のModel-View-Controllerアーキテクチャを作成し、SQL over Java Database Connectivity(JDBC)を使用してデータベースにアクセスしていました。その後、タグライブラリ、Struts、Hibernateなどの一般的な機能の多くを実行するためのコンポーネントを収集しました。最近、Springは機能の多くを単一の上から下への軽量スタックに統合しました。

Railsは当初から、これらの単純さの原則を具体化してきました。これは、Railsコミュニティに「繰り返ししないでください」および「設定より規約」として知られている原則です。 (非冗長で意味のあるデフォルトは、ソフトウェアエンジニアリングの最も古い原則の1つです。Railsのようなものを長い間待たなければならなかったのは不思議です。)フレームワークは、単純な規則に基づいて異なる層間の接続を推測します。たとえば、顧客クラスがcustomersテーブルに基づいていることをフレームワークに伝えるために、XMLやアノテーションなどは必要ありません。 RailsのActiveRecordデータベースラッピングレイヤーはこれを推測します(複数形と大文字の使用を考慮に入れます)。 Railsは、データベースの列を反映する属性を暗黙的かつ動的に追加します。last_name列は自動的にlast_name属性を作成します。

規則がニーズを満たさない特別な場合でも、純粋なRubyコードまたは軽量のRubyのようなYAML形式を使用して構成を追加できます。どちらも、XMLの冗長なブラケットと終了タグを省略しています。ただし、可能な場合はデフォルトを使用する必要があります。Railsは「意見の分かれるソフトウェア」であり、フローを進めるときにはるかに簡単になります。

Railsは「バッテリーを含む」フレームワーク(Pythonで普及しているフレーズ)です。データアクセス層からモデル、ビュー、コントローラーに至るまで、標準のデータベースベースのWebアプリケーションに必要なすべてのものが含まれています。これにより、一般的な機能を再コーディングしたり、うまく統合されたオープンソースライブラリを検索したりする代わりに、アプリケーションに固有のものに集中できます。

ダイナミズムと反省

Javaフレームワークも、リフレクションとメタプログラミングのより多くの使用に向かって動いています。たとえば、Springは、標準のJava EEサーバースタックのより静的なアプローチとは対照的に、リフレクションを使用して、依存性注入とともにすべての部分をプラグインします。人気のあるオブジェクトリレーショナルマッピングフレームワークであるHibernateは、動的メタプログラミングを使用してマッピングを行い、開発時に面倒なソースコードまたはバイトコードの生成を必要とした初期のデータアクセスフレームワークとは対照的に、実行時にバイトコードを更新します。

Hibernateの開発者は、この機能を実現するためにいくつかの高度な手法を使用する必要がありましたが、Rubyでは、メタプログラミングは言語の非常に自然な部分であるため、Railsは実行時に、マッピングだけでなく、アクセスに必要なビジネスレイヤークラス定義も動的に生成します。基盤となるデータベースを表示することで、手動コーディングや柔軟性のない生成コードの作成の必要性を最小限に抑えます。

開発プロセスのサポート

1990年代の終わりごろ、JavaプログラマーはJUnitフレームワークに「テスト感染」しましたが、サーバー側アプリケーションのテストを作成することは常に困難でした。 Springは、Webアプリケーションと一緒にテストを生成するようになりました。 Railsは同じことを行い、ダイナミズムとメタプログラミングを利用して、複数のタイプのテストをサポートします。ユニットテスト。モデルクラスの個々のメソッドを実行します。個々のWebリクエストのレベルで機能する機能テスト。統合テスト。シミュレートされたユーザーセッションで一連のWeb要求を実行します。

人気のあるAntおよびMavenツールは、Javaでのビルドの自動化を標準化しました。Railsも、Rubyのrakeビルドツールを使用してビルドを簡単にします。データベーススキーマとデータのアップグレード(またはロールバック)を自動化する革新的な移行システムを追加します。