[#33169] a cool Ruby script. — Yuji Asakawa <namu@...>

21 messages 2002/01/05

[#33229] ruby のインストールがうまくいかない — satoshi SAKAI <gau_sato@...9.dion.ne.jp>

はじめまして。

25 messages 2002/01/08
[#33230] Re: ruby のインストールがうまくいかない — shukaku@... 2002/01/08

At Tue, 8 Jan 2002 19:58:55 +0900,

[#33231] Re: ruby のインストールがうまくいかない — satoshi SAKAI <gau_sato@...9.dion.ne.jp> 2002/01/08

サカイです。

[#33233] Re: ruby のインストールがうまくいかない — nobu.nakada@... 2002/01/08

なかだです。

[#33254] Re: ruby のインストールがうまくいかない — satoshi SAKAI <gau_sato@...9.dion.ne.jp> 2002/01/09

サカイです。

[#33255] Re: ruby のインストールがうまくいかない — rubikitch <rubikitch@...> 2002/01/09

From: satoshi SAKAI <gau_sato@d9.dion.ne.jp>

[#33256] Re: ruby のインストールがうまくいかない — IWAOKA Masahiro <iwaoka@...> 2002/01/09

In the message <20020109102738.TQIO11600.femail11.im.home.ne.jp@witch>,

[#33235] " 差分ベースモジュール " in Ruby — Taku Nakajima <tnakajima@...>

中島@ブレーンです。

30 messages 2002/01/09
[#33238] Re: " 差分ベースモジュール " in Ruby — TADA Tadashi <sho@...> 2002/01/09

ただただしです。

[#33240] Re: " 差分ベースモジュール " in Ruby — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2002/01/09

Toshです。

[#33241] Re: " 差分ベースモジュール " in Ruby — Tanaka Akira <akr@...17n.org> 2002/01/09

In article <A5EF3ECC-04BE-11D6-B67B-003065DC8B1C@yb3.so-net.ne.jp>,

[#33243] Re: " 差分ベースモジュール " in Ruby — Tanaka Akira <akr@...17n.org> 2002/01/09

In article <hvoell014rl.fsf@coulee.a02.aist.go.jp>,

[#33244] Re: " 差分ベースモジュール " in Ruby — matz@... (Yukihiro Matsumoto) 2002/01/09

まつもと ゆきひろです

[#33249] Re: " 差分ベースモジュール " in Ruby — Tanaka Akira <akr@...17n.org> 2002/01/09

In article <1010559765.279084.16212.nullmailer@ev.netlab.jp>,

[#33251] Re: " 差分ベースモジュール " in Ruby — matz@... (Yukihiro Matsumoto) 2002/01/09

まつもと ゆきひろです

[#33252] Re: " 差分ベースモジュール " in Ruby — Tanaka Akira <akr@...17n.org> 2002/01/09

In article <1010566232.053696.16272.nullmailer@ev.netlab.jp>,

[#33346] IPSocket.getaddress — "Sadayuki Sakamoto" <sakacom@...>

酒本です。

16 messages 2002/01/13

[#33416] No such file to load -- dbm — satoshi SAKAI <gau_sato@...9.dion.ne.jp>

サカイと言います。(以前もお世話になりました。)

13 messages 2002/01/17

[#33462] Re: Mysql/Ruby のコンパイル — "井上 浩一" <kyoui32@...>

井上です。

34 messages 2002/01/21
[#33463] Re: Mysql/Ruby のコンパイル — HIDAKA Takahiro <cv8t-hdk@...> 2002/01/21

 ひだかです。

[#33464] Re: Mysql/Ruby のコンパイル — nobu.nakada@... 2002/01/21

なかだです。

[#33465] Re: Mysql/Ruby のコンパイル — HIDAKA Takahiro <cv8t-hdk@...> 2002/01/21

 ひだかです。

[#33466] Re: Mysql/Ruby のコンパイル — nobu.nakada@... 2002/01/21

なかだです。

[#33467] Re: Mysql/Ruby のコンパイル — HIDAKA Takahiro <cv8t-hdk@...> 2002/01/21

 ひだかです。

[#33468] Re: Mysql/Ruby のコンパイル — nobu.nakada@... 2002/01/21

なかだです。

[#33471] Re: Mysql/Ruby のコンパイル — HIDAKA Takahiro <cv8t-hdk@...> 2002/01/22

 ひだかです。

[#33473] Re: Mysql/Ruby のコンパイル — nobu.nakada@... 2002/01/22

なかだです。

[#33474] Re: Mysql/Ruby のコンパイル — HIDAKA Takahiro <cv8t-hdk@...> 2002/01/22

 ひだかです。

[#33486] Re: Mysql/Ruby のコンパイル — "TAMURA.KENICHI" <sgs02516@...> 2002/01/22

たむらです。

[#33487] Re: Mysql/Ruby のコンパイル — nobu.nakada@... 2002/01/22

なかだです。

[#33488] Re: Mysql/Ruby のコンパイル — "TAMURA.KENICHI" <sgs02516@...> 2002/01/22

たむらです。

[#33477] about nest class — sheepman <sheepman@...>

こんにちは

21 messages 2002/01/22
[#33478] Re: about nest class — matz@... (Yukihiro Matsumoto) 2002/01/22

まつもと ゆきひろです

[#33517] [BUG] Can't compile ruby on Solaris2.6 — IWAMURO Motonori <iwa@...>

岩室です。

17 messages 2002/01/25
[#33518] Re: [BUG] Can't compile ruby on Solaris2.6 — matz@... (Yukihiro Matsumoto) 2002/01/25

まつもと ゆきひろです

[#33535] broken symbolic link and File::mtime — Go Nakagawa <nakagawa@...>

中川といいます。

37 messages 2002/01/25
[#33545] Re: broken symbolic link and File::mtime — matz@... (Yukihiro Matsumoto) 2002/01/25

まつもと ゆきひろです

[#33560] Re: broken symbolic link and File::mtime — Takahiro Kambe <taca@...> 2002/01/27

In message <1012002148.661980.9788.nullmailer@ev.netlab.jp>

[#33563] Re: broken symbolic link and File::mtime — Kazuhiro NISHIYAMA <zn@...> 2002/01/27

西山和広です。

[#33564] Re: broken symbolic link and File::mtime — Takahiro Kambe <taca@...> 2002/01/27

In message <20020127213735.2369.ZN@mbf.nifty.com>

[#33575] Re: broken symbolic link and File::mtime — Kazuhiro NISHIYAMA <zn@...> 2002/01/28

西山和広です。

[#33581] Re: broken symbolic link and File::mtime — matz@... (Yukihiro Matsumoto) 2002/01/28

まつもと ゆきひろです

[#33584] Re: broken symbolic link and File::mtime — Tanaka Akira <akr@...17n.org> 2002/01/28

In article <1012194192.456224.19148.nullmailer@ev.netlab.jp>,

[#33587] Re: broken symbolic link and File::mtime — matz@... (Yukihiro Matsumoto) 2002/01/28

まつもと ゆきひろです

[#33588] Re: broken symbolic link and File::mtime — Tanaka Akira <akr@...17n.org> 2002/01/28

In article <1012208486.646506.19793.nullmailer@ev.netlab.jp>,

[#33590] Re: broken symbolic link and File::mtime — matz@... (Yukihiro Matsumoto) 2002/01/28

まつもと ゆきひろです

[#33591] Re: broken symbolic link and File::mtime — Tanaka Akira <akr@...17n.org> 2002/01/28

In article <1012212090.162851.19949.nullmailer@ev.netlab.jp>,

[#33595] Re: broken symbolic link and File::mtime — matz@... (Yukihiro Matsumoto) 2002/01/28

まつもと ゆきひろです

[#33664] rd2 コマンド( RDtool )が動かない。 — Seiji Yoneda <yoneda@...>

米田と申します。はじめて投稿します。

24 messages 2002/01/30
[#33667] Re: rd2 コマンド( RDtool )が動かない。 — ARIMA Yasuhiro <fit0298@...> 2002/01/30

有馬です。

[ruby-list:33235] " 差分ベースモジュール " in Ruby

From: Taku Nakajima <tnakajima@...>
Date: 2002-01-09 02:15:03 UTC
List: ruby-list #33235
中島@ブレーンです。

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/

In This Thread

Prev Next