Index: [Article Count Order] [Thread]

Date:  Mon, 16 Jul 2001 21:53:29 +0900
From:  NAKAJIMA Taku <tnaka@....com>
Subject:  [XP-jp:02226] Walrus と XP
To:  extremeprogramming-jp@....jp
Message-Id:  <20010716215329.C1066%tnaka@....jp>
X-Mail-Count: 02226

中島@ブレーンです。

現在、弊社ではWalrusというWEBアプリケーションサーバを開発しています。
このソフトはXP、特にテストファーストを支援するような機能を持っています。
そこで、宣伝のようで恐縮ですが、XPに関連する部分について説明させていた
だき、できれば皆様のご意見をお聞きしたいと思います。

○ 概略

WalrusはRubyをベースしたWEBアプリケーションサーバであり、GPL2ライセン
スで配布するオープンソースソフトウエアです。データベースを使うWEBサイ
トを効率的に開発できることをめざしています。特に、小規模で修正の多いサ
イトに適していると思います。

http://walrus-ruby.hoops.ne.jp/

特色としては以下のとおりです。

・ HTMLテンプレート展開による、ビジネスロジックとビューの分離
・ コンポーネント指向のWEBサイト開発
・ RubyUnit連動のテストファーストプログラミングの支援機能

○ WEB開発における問題点

一般的に、WEBシステムの開発では次のような問題があります。

・ 色や各種項目の配置など「みばえ」に関するロジック(コード)と、動的に
   変化する内容、中身が一本のソースに混在する
・ そのためデザイナーとプログラマーの分業が難しい
・ 単なるデザインの修正でも、ロジックを意識した作業が必要
・ テストのためにブラウザによる対話的な操作が必要

特にXPにおける単体テストを行なおうとすると、次の困難があります。

・ ブラウザの操作という介入なしのテストスイートの作成の負荷
・ ページ全体のHTMLを生成する長いメソッドを作りがちだが、これは
   テストが困難(UnitTestの考え方と合わない)
・ デザインの変更で生成するHTMLが変化するので、テストデータの修正が必要

Walrusは、開発当初からXPを意識しており、UnitTestを簡単に行なうことを目
的としてアーキテクチャーやAPIを設計しています。

○ Walrusにおけるデザインとビジネスロジックの分離

Walrusでは、テンプレートは特殊なタグを含まない一般的なHTMLファイルです。
通常のHTMLの中にID=xxxという属性を付加して、動的に生成する内容を指定し
ます。例えば、

<h1 id=title></h1>

というHTMLを処理する時に、id=の属性値、すなわち title をメソッド名とみ
なし、このメソッドを実行します。もし、このメソッドが

def title
  "WalrusとXP"
end

と定義されていたとすると、

<h1>WalrusとXP</h1>

というHTMLが生成され、クライアント(ブラウザ)に送信されます。

これは一番単純な例ですが、id属性を持つ要素をネストさせたり、対応するメ
ソッドが、配列やハッシュ(の組み合わせ)等の複雑なデータ構造を返却するこ
とで、いろいろなパターンのHTMLを生成することができます。詳細は下記に説
明してあります。

http://walrus-ruby.hoops.ne.jp/manual/obaq/html/index.html

○ WalrusにおけるUnitTest

既存のシステムで上記の処理を単体テストしようとしたら、

assert_equal("<h1>WalrusとXP</h1>", ...)

というテストが必要になります。もし、HTMLの表示内容が変化して、例えば、
タイトルが次のようにテーブルの中に入ったとします。

<tr><th>WalrusとXP</th></tr>

すると当然、テストも次のように修正する必要が生じます。

assert_equal("<tr><th>WalrusとXP</th></tr>", ....)

Walrusでは、ロジックの中にHTMLのタグが含まれないので、次のようなかたち
でのUnitTestが可能です。

assert_equal("WalrusとXP", doc.title)

<h1>から<tr><th>への変更のようなデザイン(みばえ)の変更は、ロジックやテ
ストに影響を与えません。

また、項目単位の部分的なテストが用意なので、本来のUnitTestとして細かい
テストを実施することができます。このあたりは下記に説明してあります。

http://walrus-ruby.hoops.ne.jp/manual/tutorial/db/index.html
http://walrus-ruby.hoops.ne.jp/manual/tutorial/db/db6.html

○ その他のテスト支援

Walrusのテストスクリプトには次の機能も含めることができます。

・ データベースの作成
・ テーブル定義
・ テストデータの作成

そのため、データベースの項目の追加等があっても、一気に過去の単体テスト
を走らせることが容易にできるようになっています。

○ データベースノ変化モ抱擁セヨ

もうひとつXP向けの機能として「データモデルオブジェクト」と「ラッパーオ
ブジェクト」があります。長くなるので詳細は省かせていただきますが、どち
らも、データベースの項目追加、修正を最低限の修正ですませる機能です。

XPなどの適応型開発手法はオブジェクト指向言語を活用することで、変化を受
けいれやすくしていますが、システムがデータベースを使用していると、そこ
がネックになって、修正コストが増大する場合があります。Walrusはこの機能
によってミスマッチを少なくするような工夫をしています。

http://localhost/koutetu/manual/reference/sql/sql1.html

○ 最後に

Walrusは開発途上なので、まだAPIも確定してないしドキュメントや品質は全
く不十分で、正直言って現段階では実際のシステムに適用することは難しいと
思います。しかし、逆に言うとまだ「いじる」余地が多いにあります。ぜひと
もみなさんの意見をいただいて、さらにXPに適したWEB開発システムにしたい
と思っていますので、よろしくお願いいたします。

-- 
「stableでなければ生きていけない。unstableでなければ生きてる意味がない」
中島 拓 (tnaka@....com)
http://www03.u-page.so-net.ne.jp/dc4/tnaka/