From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-09-17T10:50:52+09:00 Subject: [ruby-list:4356] Re: mail address class けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04313 ] the message: "[ruby-list:4313] mail address class ", on Sep/15 20:17(JST) akira yamada / やまだあきら writes: >やまだあきらです. >趣味と実益を兼ねて(ちょっと違うな ^_^;) ruby の勉強中です. >と言うわけで, メールアドレスを解析するための(?)class を >試しに作ってみました. おお. 素晴らしい. >最近の流れに沿って「どうすれば ruby らしく…」と言いたいところですが, >いい加減プログラミングのやり方も知らないド素人ですので >「どうすればプログラムらしく…」の方が問題かもしれません. >ま, それはともかく「どうすれば ruby らしく」なるか >ヒントだけでも教えていただけるとありがたいです. 私のコメントは, 松本氏のいうところの ruby らしいよりもちょっと硬いかも 知れませんが, 1つの意見だと思って聞いて下さい. 気づいたところをツラツラと書きます. 1. def debug_print(level = 0, string = "") など デフォルト引数を用いているメソッド定義がほとんどですが, 利用することは 滅多にないと思うので用いない方が良いんじゃないかと思います. 2. module RFC822 と class Addresses/class Addressについて この場合, class Addressesやclass Addressでmodule RFC822をインクルード した方が良いでしょう. そうすると例えば, def parse(mailboxes = "", header = "") parts = mailboxes.split(RFC822::DELIMITERS_REGEX) parts.delete("") が, def parse(mailboxes = "", header = "") parts = mailboxes.split(DELIMITERS_REGEX) parts.delete("") のように書けます. 3. class Addressesについて こういう複数系のクラスは滅多にないですし, クラス自身の目的も良く分かり ません. パーザと整形(folding)を兼ねている見たいですが, クラスにする必 要はないでしょう. 今回はAddressの特異メソッドにするのが良いんじゃないかと思います. class Address include RFC822 # 旧Adresses#perse: addressの配列を返す def Address.read(str) addresses = [] ... return addresses end # 旧Addresses#fold: addressの配列を受けとりfoldingする def Address.fold(addresses, len) ... end end ちなみに, もっと複雑な字句解析系や構文解析系であれば, クラスにするとい うこともありえるとは思います. 例えば, ファイルや長い文字列から1トークン づつ切り出すような機能を実装するならクラスとすることもあるとは思います. 4. 再びmodule RFC822について 上記のように Addressクラス1つになるとこのモジュールはとりあえず必要な くなりますね. Addressの(クラス)定数にすることも可能だと思います. 将来 的にこのモジュールを利用する他のクラスを用意するつもりなら今のままでも 良いと思います. 5. ここからは, 個別に指摘していきます. def debug_print(level = 0, string = "") このままだと, 1文字列しか渡せないので, def debug_print(level, *strings) としたらいかがでしょう? 実際には1文字列しか渡している例はありませんが, このようなルーチンは他 のプログラムにも使えますので, デバッグ用の汎用のモジュールとして用意し ていけば良いんじゃないかしら? # メールアドレスを扱うためのクラス: # o MX レコードを参照できる (やってない) この機能はきっとここのアドレスに対しておこなうものでしょうから, もし組 み込むならAddressのメソッドにしたら良いと思います. # o まじめに MIME エンコードできる (やってない) # o MIME デコードできる (やってない) MIMEに関しては, ここで作るのでなくて別モジュールにした方が良いと思いま すよ. そうすれば, Addressに限らずいろいろなところで利用できますから. def parse(mailboxes = "", header = "") RFC822をちゃんとは知らないので, 何ともいえないのですが, ちょっと気になっ たことを, コメント中で`"'が来た場合は, quoted-stringの始まりとして良い んですか? # このメソッドに限らずの話しなんですが, 字句解析系はもっとも rubyらし # くなくなりますね... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---