Rubyでアジャイルプロトタイピング(3)
アジャイルプロトタイピングとRuby on Rails

永和システムマネジメント鍜治舍浩
永和システムマネジメント西川仁
アークピア林秀一
2006/1/18

前のページ12

◆ アジャイルプロトタイピングを実現するRoR

 2つの哲学を徹底したRoRによって、どのようにPDSサイクルが改善されるのかを見てみましょう。

図2 RoRによるアジャイルなPDSサイクル

- PR -
  XML 定ファイルの記述は、RoRの規約によって不要です。Rubyはインタプリタ言語ですので、コンパイルも不要です。また、RoRで開発する際は、デプロイも必要ありません。DoとSeeの距離が極端に縮まったことで、開発者が集中力を切らすことはなくなります。変更と再検証が容易なため、 Planを頻繁に行うことを厭(いと)う必要もありません。開発にリズムが生まれ、開発者は能力を発揮することができ、高いモチベーションを持続することができます。

 RoRによって、私たちは開発における副次的で退屈な作業や、待ちの間の思考停止時間、合間に別のタスクを行き来する際に発生する頭のコンテキストスイッチ時間を大幅に削減し、顧客に価値を提供する「発想とモノづくり」の本質的作業に集中することができるのです。生産性が上がった結果、短期間で動作可能な成果物が増加するようになります。そして、顧客にも頻繁にSeeとPlanに加わってもらう意義が大きくなり、活発なフィードバックを得ることが可能となります。

◆ RoRの構成要素

 抽象的な話が続きましたので、ここからは少し実装寄りに視点を移して、RoRの各構成要素が、本当にアジャイルなPDSサイクルを実現できるのかどうか確認してみます。各構成要素が、2つの哲学をどのように具現化しているかに注目してください。ここでは、特に存在感がある3つの構成要素を紹介します。

・ActionPack

 MVCにおける、ビューとコントローラを担当します。ビューに関しては、RubyコードをHTMLなどのテキストに埋め込んだ形で記述できるeRuby仕様の実装である、ERBを採用しています。JSPやASPをご存じの方は、イメージしやすいのではないでしょうか。RoRでは、あえてビューとコントローラをActionPackに統合することで、RoRの哲学を踏襲しています。

 この設計によって、 画面で起こるイベントと、コントローラを基点に実装される振る舞いが、煩雑な設定ファイルなしにシームレスに連携することが可能になるという大きなメリットが生まれています。また、ActionPackは、単に生産性が高いだけのフレームワークではありません。リクエスト・レスポンスのフィルタ処理といった、現実のWebアプリケーションに不可欠な機能や、Ajaxとの連携、RSSに代表されるXMLレスポンスといった、最新の技術要素がサポートされています。しかも、ただサポートされているというだけでなく、DRYとConvention over Configurationが徹底された、驚くほど手軽に実装できる先進的な仕組みが提供されているのです。

・ActiveRecord

 ActiveRecordは、RoRにおいてデータモデルを担うO/Rマッピングフレームワークです。その名称は、Martin Fowler氏らの著書[注6]で紹介された、同名のO/Rマッピングパターンに由来します。このパターンは、下記のような特徴を持っています。

[注6]「エンタープライズ アプリケーションアーキテクチャパターン」(Martin Fowlerほか)

  • あるテーブルの1レコードが、それを表現する1つのオブジェクトに対応する

  • オブジェクトが、データベースアクセスロジック、ドメインロジックを持つ

 RoRにおけるActiveRecordは上述の特徴に、さまざまな機能を加えることで、現実のアプリケーション開発に耐える充実したものとなっています。例えば、以下のような機能があります。

  • テーブルの関連をオブジェクトの関連で表現

  • コンポジションで構成されたクラスや、継承関係のあるクラス群を1つのテーブルにマッピング

  • あるレコードが別のレコードを親として持つようなテーブルを、オブジェクトツリーにマッピング

  • レコード作成・更新時の値や参照制約に対する宣言的なバリデーション

 これらの特徴が、アジャイルプロトタイピングにどのように寄与するのでしょうか。ActiveRecordは特に、百聞は一見にしかず、といったところがあるので、簡単な例で説明します。図3のようなデータモデルがあるとします。

図3 宅配便サービスのモデル

 このデータモデルを、ActiveRecordのクラスとしてコーディングした場合、以下のようになります。

class Customer < ActiveRecord::Base
    has_many :orders
end

class Order < ActiveRecord::Base
    belongs_to :customer
    has_many :items
    has_many :services
end

class Item < ActiveRecord::Base
    belongs_to :order
    has_and_belongs_to_many :services, :join_table => 'price_list'
end

class Service < ActiveRecord::Base
    belongs_to :order
    has_and_belongs_to_many :items, :join_table => 'price_list'
end

 驚くべきことに、たったこれだけのコードで、データベースに対する以下のような操作が行えるようになります。

  • レコードの追加/更新、削除

  • オブジェクトコンポジションによる関連の操作

  • 全件検索、条件付き検索

 ActiveRecord は、実行時にデータベースからテーブル情報を取得し、インスタンス変数、アクセッサを、モデルクラスに動的に追加します。このような芸当は、動的型付け言語であるRubyならではのものです。筆者は、データベースの各カラムを持つ構造体のようなクラスをコーディングして、それからSQLを書いて、DAOを作成して……といった、お決まりの退屈で生産性の低い作業を何度も繰り返した苦い経験を持っていましたので、ActiveRecordの爽快さに驚嘆しました。同様に感じられた方も多いのではないでしょうか?

・ActiveRecordとRoRの哲学

 ActiveRecord の根底に流れるRoRの哲学を感じてみてください。カラムの情報はデータベースのテーブル定義1カ所でのみ定義され、クラスにおいては、一切の重複情報が排除されています。まさにDRYが徹底されているのです。そして、ActiveRecordには、このDRYを可能にする洗練された規約が多数存在しています。なお、Convention over Configurationの説明ですでに述べたように、明示的な指定により、規約とは異なる動作をさせることも可能です。ActiveRecordの規約を以下にいくつか示します。

  • “id”という名称のカラムがプライマリキーとなる

  • テーブル名称は、モデルクラス名称の複数形と認識される(例:Item→Items)

  • モデルクラスにおいて、あるカラムに対するアクセッサの名称には、カラムの名称が使用される

  • 多対多の関連には関連テーブルが使用される、例:料金表(price_list)テーブル

 Rubyの柔軟性、DRY、Convention over Configurationが見事に相互作用して、ActiveRecordの洗練された記述が可能となっているのです。

・ソースの自動生成機能

 ActionPack やActiveRecordとは異なり、実行時にアプリケーションの構成要素となるものではありませんが、アジャイルプロトタイピングにおいては、特に威力を発揮します。筆者の環境では、rails<アプリケーション名>というコマンドを実行することで、アプリケーションのひな型となる、67のファイルやディレクトリが生成されました。

 RoRでは、アプリケーション開発の最初だけではなく、機能を追加していく際にもひな型を生成できるgenerateコマンドが提供されています。generateコマンドでは、モデル、ビュー、コントローラ、いずれのひな型も生成できるうえ、モデルに対するCRUD操作を行う機能(つまりマスタメンテナンス画面)まで生成できてしまいます。これによって、同じようなコーディングを繰り返す必要がなくなり、DRYに忠実になることができます。恐ろしいほどのダイナミズムとスピード感です。

 RoRによって、アジャイルプロトタイピングが現実的なものとなることを感じていただけたでしょうか。

 RoR に対して、「ツール」という言葉はもはや不適切ですらあるかもしれません。RoRの存在は、ハードな開発に十分耐える高スペックなマシンが使用できること、顧客との距離が近いこと、信頼できる同僚がいること、職場のコーヒーが安いことなどに勝るとも劣らない重要性を持つ「環境」といえるのです。RoRという新しい環境は、私たちにより良い仕事のスタイルを取ることを可能にしてくれるでしょう。

 次回は、RubyとRoRでプロトタイプを作成しながら、アジャイルプロトタイピングを進めていく過程をお伝えする予定です。

2/2

 INDEX

Rubyでアジャイルプロトタイピング(3)
アジャイルプロトタイピングとRuby on Rails
  Page1
◆ アジャイルプロトタイピングの性質
Page2
◆ アジャイルプロトタイピングを実現するRoR

IT Architect 連載記事一覧


この記事に対するご意見をお寄せください managemail@atmarkit.co.jp

キャリアアップ

@IT Sepcial

「ITmedia マーケティング」新着記事

中高生のロールモデル消費 マスメディアより友人の話が情報源――大広・日本インフォメーション調査
ポストゆとり世代・ポストミレニアル世代である15〜18歳の中高生を対象に、多様化する価...

「スタディサプリ」「メチャカリ」「BASE FOOD」「THEO」 サブスク型ビジネスにおける広告戦略
サブスクリプションビジネスにおける広告戦略や新規顧客獲得について注目サービスを展開...

男性が職場や学校、家庭で感じている「生きづらさ」について――Lean In Tokyo調べ
実は少なくない男性が生きづらさを感じているという調査結果です。