From: Minero Aoki Date: 2002-09-01T15:23:40+09:00 Subject: [ruby-dev:18131] Re: Selection IPv4/IPv6 at TCPSocket あおきです。 In mail "[ruby-dev:18130] Re: Selection IPv4/IPv6 at TCPSocket" GOTO Kentaro wrote: > TCPSocket のサブクラスとして TCPSocket4 と TCPSocket6 を、 > TCPServer のサブクラスとして TCPServer4 と TCPServer6 を用意 > してはどうかということです。TCPServer と TCPSocket 自体は現 > 状のままでです。一番のメリットはオプショナルな引数を使わなく > て良いことです。 > > 結局のところ TCPSocket の一族は一度 new したらそのインスタン > スのプロトコルを変更することはないので、コンストラクタだけが > 違うのなら別のクラスになっている方が分かりやすいだろうと思い > ました。 Net::POP と APOP を作ってみた経験からすると、クラスで分けるのは どことなく不便です。たとえばリソースファイルの値で分岐しようと すると (apop ? Net::APOP : Net::POP).new(...) というみっともないことになってしまうし、GUI に "POP"/"APOP" の 表記を出そうとすれば (Net::APOP === pop ? 'APOP' : 'POP') となりますし……。んで結局 Net::POP.APOP(apop_p) というのを 作ったり、Net::POP#apop? を作ったりして補っているわけですが、 それくらいなら最初から Net::POP.new(addr,port,apop_p) (Net::POP#pop?) Net::POP#apop? としたほうがインターフェイスも実装も素直になります。 思うに、「基本的には同じだけでちょっとだけ違うもの」というのは いつか誰かが区別したがるときが来るのではないでしょうか。そのときに うまく区別できるか、あるいはうまく区別できなくてもその区別をする 回数が異様に少ないか、どちらかでないといけないんだと解釈してます。 で、「うまく区別できる」ためにはメソッドであるほうがよいと。 ------------------------------------------------------------------- 青木峰郎