[#33169] a cool Ruby script. — Yuji Asakawa <namu@...>
From: Yuji Asakawa <namu@venus.dti.ne.jp>
From: Yuji Asakawa <namu@venus.dti.ne.jp>
[#33172] [ANN] Ruby/zlib 0.5.0-pre1 — UENO Katsuhiro <unnie@...>
うえのです。
[#33183] [ANN] TMail 0.10 — Minero Aoki <aamine@...>
あおきです。
[#33185] rd-mode: rd-intelligent-newline — "Shirai,Kaoru" <shirai@...1jp.com>
白井といいます。
[#33208] Method passing block — sinara@...
原(信)です。
[#33229] ruby のインストールがうまくいかない — satoshi SAKAI <gau_sato@...9.dion.ne.jp>
はじめまして。
At Tue, 8 Jan 2002 19:58:55 +0900,
サカイです。
なかだです。
サカイです。
From: satoshi SAKAI <gau_sato@d9.dion.ne.jp>
In the message <20020109102738.TQIO11600.femail11.im.home.ne.jp@witch>,
さくです。
いわおかです。
さくです。
In message <20020110020553.61dd3936.crouton@weatherlight.org>
[#33234] DB のカラム名をもった各行のオブジェクトへ向けて — encore ann <i@...>
もりかわです。
[#33235] " 差分ベースモジュール " in Ruby — Taku Nakajima <tnakajima@...>
中島@ブレーンです。
ただただしです。
Toshです。
In article <A5EF3ECC-04BE-11D6-B67B-003065DC8B1C@yb3.so-net.ne.jp>,
In article <hvoell014rl.fsf@coulee.a02.aist.go.jp>,
まつもと ゆきひろです
In article <1010559765.279084.16212.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <1010566232.053696.16272.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <1010568827.806757.16317.nullmailer@ev.netlab.jp>,
なかだです。
nobu.nakada@nifty.ne.jpさんの
[#33263] RDtool インストールでの疑問 — satoshi SAKAI <gau_sato@...9.dion.ne.jp>
サカイです。
[#33288] HTML から BODY を抜き出す — m_seki@...
坂野 正明です。
MoonWolfです。
[#33300] 日付順のソートについて — "Tatsuaki Nagai" <Tatsuaki_Nagai@...>
永井@KCです。
[#33326] [ 質問 ] クラスメソッドのモジュールによる実現方法 — Hiroyuki Komatsu <komatsu@...>
小松と申します. はじめまして.
[#33346] IPSocket.getaddress — "Sadayuki Sakamoto" <sakacom@...>
酒本です。
酒本です。
In article <009501c19c02$aaa39740$65bc80da@pc0>,
In article <hvo66668ztc.fsf@coulee.a02.aist.go.jp>,
まつもと ゆきひろです
[#33356] about pty and expect on 1.7.x — YANAGAWA Kazuhisa <kjana@...4lab.to>
ruby-talk の話見ててちょっと思いだしたんですが....
[#33367] [ANN] rb2exe-preview1 — Yuya Kato <yuya@4th.to>
[#33381] [ANN] WString 0.0.8 — takuma ozawa <metal@...>
小澤といいます。
[#33392] Re: [ANN] rb2exe-preview1 — Nagai T <idonagai@...>
なかだです。
ひだかです。
ふたたびひだかです。
またひだかですが(^_^;
[#33398] ruby-mode のインデント不具合 (} + の次の行) — MALTA Koji <malta@...>
丸田と申します。
[#33416] No such file to load -- dbm — satoshi SAKAI <gau_sato@...9.dion.ne.jp>
サカイと言います。(以前もお世話になりました。)
まつもと ゆきひろです
ただただしです。まいどどうも(?)。
サカイです。
[#33427] CGI でキャッシュ — Fujikawa Norihide <ruby@...>
てんしゅう@ねむぅ。
[#33443] libpgsql-ruby-0.6.5 で Linux+PostgreSQL+Ruby について — "井上 浩一" <kyoui32@...>
井上です。
[#33462] Re: Mysql/Ruby のコンパイル — "井上 浩一" <kyoui32@...>
井上です。
ひだかです。
なかだです。
ひだかです。
なかだです。
ひだかです。
なかだです。
ひだかです。
なかだです。
ひだかです。
たむらです。
なかだです。
たむらです。
西山和広です。
たむらです。
高橋征義です。
たむらです。
[#33477] about nest class — sheepman <sheepman@...>
こんにちは
まつもと ゆきひろです
あおきです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
[#33517] [BUG] Can't compile ruby on Solaris2.6 — IWAMURO Motonori <iwa@...>
岩室です。
まつもと ゆきひろです
岩室です。
わたなべです。
[#33520] IP に関するライブラリ cygwin & linux — "井上 浩一" <kyoui32@...>
井上です。
さくです。
In article <20020125163631.076601cb.crouton@weatherlight.org>,
さくです。
[#33535] broken symbolic link and File::mtime — Go Nakagawa <nakagawa@...>
中川といいます。
まつもと ゆきひろです
In message <1012002148.661980.9788.nullmailer@ev.netlab.jp>
西山和広です。
In message <20020127213735.2369.ZN@mbf.nifty.com>
西山和広です。
まつもと ゆきひろです
In article <1012194192.456224.19148.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <1012208486.646506.19793.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <1012212090.162851.19949.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <1012227444.855288.20722.nullmailer@ev.netlab.jp>,
In message <hvoy9ii4eon.fsf@coulee.a02.aist.go.jp>
In article <200201281639.g0SGdRH29664@edge.sky.yamashina.kyoto.jp>,
さくです。
うぅむ。もうすこし早く Subject: を変えるべきであった...
まつもと ゆきひろです
In article <1012282185.518684.23103.nullmailer@ev.netlab.jp>,
In article <1012208486.646506.19793.nullmailer@ev.netlab.jp>,
[#33547] racc fails on alpha-freebsd — Minero Aoki <aamine@...>
あおきです。
In message <20020126123640V.aamine@mx.edit.ne.jp>
あおきです。
[#33556] Cgi::session in eRuby — kyosuke kiyooka <k@7ruby.com>
きよおかです。
きよおかです。
[#33570] NHK スペシャル「変革の世紀」 — rubiben <ozaki@...>
[#33613] Re: ある文字列以外の部分にマッチさせる方法 — "Tatsuaki Nagai" <Tatsuaki_Nagai@...>
永井です。
[#33664] rd2 コマンド( RDtool )が動かない。 — Seiji Yoneda <yoneda@...>
米田と申します。はじめて投稿します。
有馬です。
サイトウさん、有馬さん、ありがとうございます。
たむらです。
ひだかです。
[#33689] Windows をリブートするスクリプトはありますか?。 — Take_tk <ggb03124@...>
どちら様か、Windows をリブートするスクリプトを既に作っておられないでしょ
[ruby-list:33235] " 差分ベースモジュール " in Ruby
中島@ブレーンです。
http://www.ogis-ri.co.jp/otc/hiroba/technical/MixJuice/
で、"差分ベースモジュール"という手法が提示されています。この言葉はこの記
事で知ったのですが、Walrusの実装で私はこれと似たようなことをRubyで行なっ
ています。
これについて、みなさんの意見やアイディアをいただけたらと思って、まとめて
みました。
○ 差分ベースモジュールとは
詳しくは、上記の記事に譲りますが、簡単に言うと、一連のクラスに「ちょっと
ずつ」メソッドを追加していくことだと思います。
普通のオブジェクト指向言語では既存のクラスに機能を追加する場合は継承を使
いますが、is-a関係を表現するための継承と、差分を実装するための継承が混在
すると、構造が複雑になります。
例えば、親クラスPと子クラスCがあったとします。両者に何かメソッドを追加す
る場合、Pを継承してP2、Cを継承してC2を作成し、P2,C2に新しいメソッドを追
加することになります。
P → C →: is-a関係を表現する継承
↓ ↓ ↓: 差分を実装するための継承
P2 C2
この図の↓で表わされている関係を別のメカニズムで表現しようと言うのが、
"差分モジュール"という考え方だと思います。
○ Rubyにおける差分モジュールもどき
上記の記事では、Java言語をベースにMixJuiceという新しい言語を設計して、
"差分モジュール"を実現していますが、Rubyではクラスが閉じていないので、ソー
スファイルを単位として似たようなことを行なうことができます。
なお、Rubyのmoduleとここで言うソースファイルベースの差分モジュールのエミュ
レーションとは別ものです。ややこしいので、Rubyのmoduleは英語でmoduleと書
きます。
Rubyによる差分モジュールの実現は次のようになります。
ソース1
-------------------------------------------
class P
...
end
class C < P
...
end
-------------------------------------------
ソース2
-------------------------------------------
require ソース1
class P
def xxx
...
end
end
class C
def yyy
....
end
end
-------------------------------------------
ソース1が基本モジュールで、ソース2がそれを"継承"した子モジュールです。
xxxとyyyが関係が深く、他のメソッドと独立しているとすると、xxxやyyyを使わ
ない人は、ソース1のみを使用し、xxxやyyyを使用する人はソース2を使用します。
ソース1に直接メソッドを追加していくと、ソース1がどんどん大きくなっていく
し、追加した機能の不具合がそれを使用しない人にも影響する可能性があります
が、このように分割していけば、ソースがコンパクトで関連する機能が近くにあ
りますから、メンテナンスが楽です。
○ Walrusでの使用例
Walrusは静的なHTML生成ツールとして開発して、アプリケーションサーバに発展
しました。そして、最初の生成ツールの段階で、次のようなクラスの階層ができ
ていました。
WalrusObject → Folder
→ DocumentFIle
→ HtmlDocument
→ DiaryDocument
→ ManualDocument
→ ....(各アプリケーションのドキュメント)
→ BinaryFile
→ ImageFile
→ ArchiveFile
これを拡張してアプリケーションサーバにしたわけですが、各階層のそれぞれの
クラスにちょっとずつメソッドを追加する必要があります。ここでどうするか悩
みました。
(1) クラス階層再設計
既に完成して(個人的に)運用しているHTML生成ツールが動かなくなるのは避けた
かった。また、HTML生成ツールとしてもアプリケーションサーバとしても対象の
論理的なモデルは同一なので、クラス設計はこのままでよいと思った。
(2) クラスにメソッドを追加していく
追加するメソッドの行数は少ないが、いろいろなクラスにちらばっていて、相互
の関連が深い。デバッグのために、あちこちのソースをちょっとずつ見る必要が
ある。
(3) "差分モジュール"
追加機能と既存機能が分離され、開発、デバッグがしやすい。
ということで、(3)を選択しました。
具体的には、walrus.rbが基本モジュールで、rope.rbがそれにアプリケーション
サーバの機能を追加するモジュールです。rope.rbで追加したクラスもあります
が、ほとんどはwalrus.rbに定義されているクラスにメソッドを追加しています。
なお、追加するメソッドはmoduleにまとめて、既存のクラスにMixinしました。
○ もどきの限界、問題点
Walrusのソースは機能単位に分割されていていて、ssc.rbがセッション管理、
db.rbがデータベースアクセス機能・・・というふうになっています。しかし、
上記の一箇所以外では、差分モジュールの手法は使わず、新規のクラスの定義だ
けにしています。
本当は他のソース(機能追加)でも、差分モジュールで既存のクラスに機能を追加
した方が、うまくまとまる場合もあったのですが、自分ではこれは「変なやり方」
と思っていたので、自重してしまいました。もっと早く、この論文を見ていたら
結果が違ったかもしれません。
ただ、ひとつのクラスが複数のクラスに分割されているというのは、気分的に落
着かないものです。特に、名前の衝突が問題になります。
MixJuiceでは可視性の概念がJavaからかなり拡張(整理?)されているようです。
"差分モジュール"をダイヤモンド継承している時、兄弟関係にあるモジュールで
名前が衝突していても大丈夫みたいです。
上記のもどき手法で、複雑な差分モジュールの継承関係(ダイヤモンド継承)も可
能だと思いますが、名前の衝突が起きると悲惨なバグになります。
○ 質問
今後、Walrusを開発していく時に、差分モジュール方式の機能別ソース分割のま
までよいのか、クラス単位に整理しなおした方がよいのか迷っています。それで
お尋ねしたいのですが、
・ Rubyでこのような"差分モジュール"を使っている例は他にありますか?
・ 名前の衝突を避けるよい方法はないでしょうか?
・ 実行時コスト的な観点から、不要なメソッドを大量にloadする負荷について
どうなのか?
・ 全体的にこのような手法について、みなさんはどう思いますか?
--
「stableでなければ生きていけない。unstableでなければ生きてる意味がない」
中島 拓 (株)ブレーン 研究部 (tnakajima@brain-tokyo.jp)
http://www.brain-tokyo.jp/~research/koutetu/