[#23026] ruby compile/ruby-gtk — Taiji.Can@...
[#23031] description on fork and Process.fork — kjana@... (YANAGAWA Kazuhisa)
マニュアルみてて思ったんですけど,fork の記述に「失敗したら例外があが
In message <200006021503.AAA19483@mail3.os.xaxon.ne.jp>
In message <200006081406.e58E6JA16512@edge.sky.yamashina.kyoto.jp>
In message <200006091328.WAA23409@mail2.os.xaxon.ne.jp>
まつもと ゆきひろです
有馬です。
新井です。
まつもと ゆきひろです
[#23032] Racc Array#filter -> collect! — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp>
Toshです。
[#23052] UTF-8 on print method — kenn@...
長沢です。
>SJIS に無い文字を出力する場合はどうすれば良いんでしょうか?
高橋征義です。
[#23061] rfc822.rb parse error — Hideto ISHIBASHI <hideto-i@...4u.or.jp>
石橋"rubyholic"秀仁です。
日時 Mon, 5 Jun 2000 21:23:17 +0900 の
[#23088] 文字列置換 — Takayuki Tanaka <tanaka@...>
Ruby初心者のTanです。
[#23095] setup.rb testrun — rubikitch <rubikitch@...>
るびきちです。
[#23096] http.rb will change — Minero Aoki <aamine@...>
あおきです。
まつもと ゆきひろです
高橋征義です。
まつもと ゆきひろです
青山です。
高橋です。
青山です。
高橋征義です。
青山です。
あおきです。
高橋征義です。
あおきです。
高橋征義です。
あおきです。
TAKAHASHI Masayoshi <maki@inac.co.jp> wrote:
あおきです。
直井と申します.
In message "[ruby-list:23263] synchronize or lock"
In message <200006142243.HAA20586@hanare00.math.sci.hokudai.ac.jp>
[#23116] making Array — OZAWA Sakuro <crouton@...>
さくです。
[#23125] メソッドの中の動きを変える — Masahiro Kawata <kawata@...>
こんにちわ。かわた まさひろと申します。
From: Masahiro Kawata <kawata@titan.co.jp>
[#23156] ports — Wakou Aoyama <wakou@...>
青山です。
長沢です。
青山です。
青山です。
青山です。
まつもと ゆきひろです
青山です。
青山です。
まつもと ゆきひろです
青山です。
Toshです。
青山です。
Toshです。
青山です。
Toshです。
青山です。
Toshです。
[#23161] RDtool trouble. — rubikitch <rubikitch@...>
るびきちです。
[#23168] media watch 2000.06.08 — Noritsugu Nakamura <nnakamur@...>
[#23169] Kconv::guess(str) — NAWATE Masahiko <agul@...>
縄手@松江です。
In message "[ruby-list:23169] Kconv::guess(str)"
日時 Mon, 12 Jun 2000 22:10:19 +0900 の
[#23185] commonly used notation — Hideto ISHIBASHI <hideto-i@...4u.or.jp>
石橋"rubyholic"秀仁です。
[#23197] self の振る舞いを書き換えたいです — Kenya Ogata <k_ogata@...>
こんにちは、おがたといいます。
[#23222] readablity of RD — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
Toshです。
From: TAKAHASHI Masayoshi <maki@inac.co.jp>
高橋征義です。
おがたといいます。
Toshです。
おがたです。いくつか考えうる解決案を。
Toshです。
青山です。
青山です。
Toshです。
青山です。
Toshです。
青山です。
Toshです。
青山です。
Toshです。
まつもと ゆきひろです
青山です。
まつもと ゆきひろです
Toshです。
From: Toshiro Kuwabara <toshirok@yb3.so-net.ne.jp>
まつもと ゆきひろです
Toshです。
まつもと ゆきひろです
From: Toshiro Kuwabara <toshirok@yb3.so-net.ne.jp>
Toshです。
青山です。
Toshです。
まつもと ゆきひろです
Toshです。
まつもと ゆきひろです
Toshです。
[#23235] nkf MIME space handling — "Kikutani, Makoto" <kikutani@...>
nkfモジュールは、MIMEのデコードもしてくれますが、
わたなべです.
日時 Wed, 14 Jun 2000 13:27:29 +0900 の
こんにちは。鈴木教郎です。
日時 Wed, 14 Jun 2000 16:10:52 +0900 の
こんばんは。鈴木教郎です。
[#23277] net/smtp.rb extra lines ? — "Kikutani, Makoto" <kikutani@...>
どうも、最近自分の出したメイルに2行くらい余計な空行が最後に
[#23284] Ruby/zlib — Ueno Katsuhiro <unnie@...>
うえの@ぶるーすかいです。
[#23305] xmarshal.rb — Masatoshi SEKI <m_seki@...>
[#23311] UTF-8 in RubyBook — "Kikutani, Makoto" <kikutani@...>
Ruby本読み直しちう。
[#23356] rd2texi-lib.rb 最新版? — Noritsugu Nakamura <nnakamur@...>
[#23359] ASP — Yoshinori Tahara <platypus@...1.mbn.or.jp>
はじめまして、田原@鎌倉です。
[#23368] Message Digest (MD5) Function — Hagemu Higuchi <hahiguc@...11.odn.ne.jp>
cygwin32で使用しています。件名のような関数は
[#23372] (GMT+0500) — "Kikutani, Makoto" <kikutani@...>
curが堕ちる、というreportがあったので調べると日付が
あああ,ごめんなさい.脊髄で反応してしまいました (_ _).
[#23385] DBMS and ruby CGI — toyofuku@...
豊福です。
[#23410] Re: DBMS and ruby CGI — "Kahori Takeuchi" <EB89012@...>
こんにちは、時田です。
[#23411] dump a single object — Hideto ISHIBASHI <hideto-i@...4u.or.jp>
石橋"rubyholic"秀仁です。
まつもと ゆきひろです
石橋"rubyholic"秀仁です。いろいろとゴタクが長いです (^^;
なひです.
なかだです。
石橋"rubyholic"秀仁です。咳さん、こんばんわ。
石橋"rubyholic"秀仁です。
まつもと ゆきひろです
石橋"rubyholic"秀仁です。
石橋"rubyholic"秀仁です。どうも。
石橋"rubyholic"秀仁です。どうも。
[#23454] MHC in RAA — Yoshinari Nomura <nom@...>
乃村@九大です。
まつもと ゆきひろです
[#23477] Re: DBMS and ruby CGI — toyofuku@...
豊福です。
[#23485] Ruby 1.4.5 — matz@... (Yukihiro Matsumoto)
Ruby 1.4.5 is out, check out:
小松です。
まつもと ゆきひろです
どぉも、道村です。
小松です。
小松です。
どぉも、道村です。
小林です。
小林です。
どぉも、道村です。
小松です。
どぉも、道村です。
[#23504] 拡張ライブラリの作り方 — Akimichi Tatsukawa <akimichi@...>
立川と申します。はじめて投稿します。よろしくお願いします。
さくです。
From: OZAWA Sakuro <crouton@duelists.org>
小松です。
[#23509] Dimension of array — agul@...
縄手@松江です。
わたなべです.
原です。
縄手@松江です。
[#23519] media watch 2000.06.24 — Noritsugu Nakamura <nnakamur@...>
[#23558] ruby-1.4.5 GNUmakefile — IWATSUKI Hiroyuki <don@...>
岩月と申します。
[ruby-list:23186] Re: メソッドの中の動きを変える
石橋"rubyholic"秀仁です。コードを含むので長いです。
リファクタリング (refactoring) だと思って読んでください。
From: Shin-ichiro Hara <sinara@blade.nagaokaut.ac.jp>
Subject: [ruby-list:23166] Re: メソッドの中の動きを変える
> 原です。
>
> |石橋"rubyholic"秀仁です。
>
> |つきつめると、継承どころか Mix-in さえ「やりすぎ」だと感じる
> |ようになってきました。これはおおげさですが、「安易に」継承や
> |Mix-in の採用を決めるのは、悪い設計への落し穴だと思います。
>
> でも、Factory Method でも、操作の切替えに継承を用いるのではないでし
> ょうか。実は良く分かってないんですけど Factory Method。(^^;
GoF 本どおりに Factory Method を実装してみます。
# Application AbstractDB
# ^ ^
# | inherits | inherits
# +----------+---------+ +--+---+
# | | | |
# MysqlApplication CsvApplication Mysql Csv
# | | ^ ^
# +----------------------------+ |
# uses +--------------------+
# uses
class Application
def createDB # abstract method
end
def restore
@db = createDB
@db.restore
end
end
class MysqlApplication < Application
def createDB
Mysql.new
end
end
class CsvApplication < Application
def createDB
Csv.new
end
end
class AbstractDB
def restore; open; read; close; end
def open;end
def read;end
def close;end
end
class Mysql < AbstractDB
def open; puts "open Mysql";end
def read; puts "read Mysql";end
def close; puts "close Mysql";end
end
class Csv < AbstractDB
def open; puts "open Csv";end
def read; puts "read Csv";end
def close; puts "close Csv";end
end
foo = MysqlApplication.new
#foo = CsvApplication.new
foo.restore
でも Ruby なら継承を使わない方法もあります。Application#restore
と AbstractDB#restore をほかのクラスに吸収します。
class Application
def setDB(db)
@db = db
end
def restore
@db.restore
end
end
class Mysql
def restore; open; read; close; end
def open; puts "open Mysql";end
def read; puts "read Mysql";end
def close; puts "close Mysql";end
end
class Csv
def restore; open; read; close; end
def open; puts "open Csv";end
def read; puts "read Csv";end
def close; puts "close Csv";end
end
foo = Application.new
foo.setDB(Mysql.new)
#foo.setDB(Csv.new)
foo.restore
継承がなくなりました。DB (Mysql, Csv) がクライアント
(Application) に提供するインターフェースは #restore だけです。
observer.rb の #update と同じ考えかたですね。
クラスがクライアントに提供する interface を少なく制限することで、
継承を使わなくても整合性の問題などに悩まされることはありません。
# もちろんトレードオフです。継承が適した場合もあります。
<継承と委譲>
ところで、Mysql と Csv には同じようなコードがありますね。
同じようなコードをまとめるには継承を使うことがあります。しかし、
継承はホワイトボックス的再利用です。それに対して、委譲 (包合) は
ブラックボックス的再利用です。
たとえば継承による再利用では、スーパクラスのあるインスタンス
変数が除去されたらサブクラスも書きかえる必要がありますよね。
委譲なら、クラスのインターフェースとリスポンシビリティ (責任)
が変わらなければ、クライアントのコードを書きかえる必要がない。
</継承と委譲>
つぎに Mysql と Csv は既存のクラスで変更できないと仮定します。
既存のクラスですから、メソッド名が都合よく open, read, close
にそろっているはずありません。つぎのコードでは委譲で再利用します。
ちなみに GoF の Adapter パターンです。xInterface が Adapter です。
この仮定は既存のクラスを再利用するというだけではありません。
adaptee クラス (Mysql, Csv) の将来の変更が、client
(Application) に波及しないようにする意味もあります。
# class Application は上と同じ
class MysqlInterface # <<adapter>>
def restore
db = Mysql.new
db.connect
db.query
db.disconnect
end
end
class CsvInterface # <<adapter>>
def restore
csv = Csv.new
csv.open
csv.read
csv.close
end
end
class Mysql # <<adaptee>>
def connect; puts "new Mysql";end
def query; puts "query Mysql";end
def disconnect; puts "disconnect Mysql";end
end
class Csv # <<adaptee>>
def open; puts "open Csv";end
def read; puts "read Csv";end
def close; puts "close Csv";end
end
foo = Application.new
foo.setDB(MysqlInterface.new)
#foo.setDB(CsvInterface.new)
foo.restore
こんどは、Application が直接には Mysql や Csv を扱いません。
xInterface クラスが仲介し、Mysql と Csv のインターフェースを
Application に適合 (adapt) させます (#restore を提供)。
さて、これまでに 3 つのコードを示しました。
将来の変更に強い柔軟な設計は最後のコードだと思います。
> ですか。こんな感じで、継承は使う時は使いますよね。ただ、使う
> 場所を選ぼう、ということですか。
そうですね。継承は (よく切れるナイフのように) 強力で、危険です。
継承は "is-a" 関係と言われますけど、"is-a" には 2 つの意味が
あります。それを混同すると危険です。
『UML モデリングのエッセンス』に解説 (6.11 分類と汎化) があります。
"is-a" には「分類」と「汎化」の場合があり、「汎化は推移的
(B<A で C<B なら C<A) ですが、分類は推移的ではありません」ので、
誤ったサブクラス化により、「サブクラスが不適切になり、
リスポンシビリティが混乱するおそれがあります」。
# 汎化は "is-a-kind-of" で、分類は "is-an-instance-of" です。
# とまではっきりと書いてありません (^^;
# 英語の意味ではなく関係の意味を考えるべきですね。
こうした "is-a" の混乱により、
* スーパクラスの内部的な変更がサブクラスへ波及する。
容易に変更できないガラス細工のような設計になる。
* サブクラスが不適切にスーパクラスの責任を乗っ取る。
スーパクラスが使われているところは、すべてサブクラスで
置換可能だというルールが破られる。
ということになります。
<汎化と特化>
ぼくは複数のクラスから共通性を抽出して汎化する方法 (ボトムアップ
アプローチ) を好みます。さきにスーパクラスを定義してから、
サブクラスをいくつも定義するやりかた (トップダウンアプローチ)
にはリスクがあります。そのリスクとは、早いうちにクラス階層を
確定するリスクです。
分析/設計が進むうちに継承関係が不適切だと分かることがあります。
将来を正確に予見するのは困難ですから、トップダウンが得意でない
人はボトムアップのほうが安全です。この点で動的言語は気楽です。
# しかしドメインレベルの概念的分析においては、トップダウン
# アプローチで分析が軌道にのることもありますね。この話は
# ソフトウェアクラスの分析/設計についての話です。
</汎化と特化>
さて、スレッドの Subject は「メソッドの中の動きを変える」
ですけど、なぜここに至ったかを再検討することも有益です。
クラスを増やしたり減らしたりするより、すでにあるクラスの
メソッドをいじくるほうが手軽に思えるものです。しかし、
オブジェクトの協調 (collaboration) を検討するほうが、
早く答えに近づくと思いますよ。
「メソッド」はオブジェクト (クラス) が「責任」を果たすための
手段にすぎない、と考えて、まずは複数のオブジェクト (クラス)
の協調を設計することを考えるほうが良いと思います。
そのためには CRC カードという手法が有効だと思います。
# ぼくは CRC カードについて詳しいわけではなく、我流です。
# 日本語の解説は『UML モデリングのエッセンス』のコラムくらい?
--
Hideto "rubyholic" ISHIBASHI
http://www.rr.iij4u.or.jp/~hideto-i/
blade clone (yaiba) development:
http://www.rr.iij4u.or.jp/~hideto-i/rb/yaiba/index.html