RSS::Maker.create(version)

 RSS::Maker で、 “2.0” 等の文字列でフィードのフォーマットを渡す
インターフェースは事実上 RSS::Maker.make(version) {|maker| … }
しかありません。(maker = RSS::Maker::XXXXX.new 相当ができない)

 しかし、RSSã®ç”ŸæˆãŒå‡¦ç†ã®ä¸»çœ¼ã§ãªã„å ´åˆã‚„ã€è¤‡æ•°ã®RSSフィードを
åŒæ™‚ã«ä½œã£ãŸã‚Šã™ã‚‹å ´åˆã€ãƒ–ãƒ­ãƒƒã‚¯ã®å°Žå…¥ãŒå¿…é ˆã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¯
使いづらいです。

 そこで、 RSS::Maker.create(version) ã®ã‚ˆã†ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’è¿½åŠ ã™ã‚‹
のはどうでしょうか。つまり、

FEED_FORMAT = "2.0"
ARTICLES_RSS = File.expand_path("~/public_html/feeds/articles.rss")
IMPORTANT_ARTICLES_RSS = 

File.expand_path("~/public_html/feeds/important_articles.rss")

rss = RSS::Maker.make(FEED_FORMAT) { |rssmaker|
  # ... channel, image等の設定

  rss_important = RSS::Maker.make(FEED_FORMAT) { 

|rssmaker_important|
# … channel, image等の設定

    articles.each { |article|
      rssmaker.new_item { |item|
        item.title = article.subject
        # ... link, date等の設定
      }
      if article.important?
        rssmaker_important.new_item { |item|
          item.title = article.subject
          # ... link, date等の設定
        }
      end
    }
  }
  File.open(IMPORTANT_ARTICLES_RSS, "w") { |w|
    w.print(rss_important.to_s)
  }
}
File.open(ARTICLES_RSS, "w") { |w|
  w.print(rss.to_s)
}

の本処理部分を

rssmaker = RSS::Maker.create(FEED_FORMAT)
# ... channel, image等の設定

rssmaker_important = RSS::Maker.make(FEED_FORMAT)
# ... channel, image等の設定

articles.each { |article|
  rssmaker.new_item { |item|
    item.title = article.subject
    # ... link, date等の設定
  }
  if article.important?
    rssmaker_important.new_item { |item|
      item.title = article.subject
      # ... link, date等の設定
    }
  end
}
File.open(IMPORTANT_ARTICLES_RSS, "w") { |w|
  w.print(rssmaker_important.to_feed.to_s)
}
File.open(ARTICLES_RSS, "w") { |w|
  w.print(rssmaker.to_feed.to_s)
}

ã®ã‚ˆã†ã«ãƒ•ãƒ©ãƒƒãƒˆãªæ§‹é€ ã§æ›¸ããŸã„ã€ã¨ã„ã†ã‚ã‘ã§ã™ã€‚

 以下がパッチです。

Index: lib/rss/maker.rb

— lib/rss/maker.rb (revision 20367)
+++ lib/rss/maker.rb (working copy)
@@ -5,10 +5,14 @@ module RSS
MAKERS = {}

 class << self
  •  def make(version, &block)
    
  •  def create(version)
       m = maker(version)
       raise UnsupportedMakerVersionError.new(version) if m.nil?
    
  •    m[:maker].make(m[:version], &block)
    
  •    m[:maker].new(m[:version])
    
  •  end
    
  •  def make(version, &block)
    
  •    create(version).make(&block)
     end
    
     def maker(version)

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37210] RSS::Maker.create(version)” on Thu, 27 Nov 2008
15:22:05 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B!!e(BRSS::Maker e$B$G!“e(B “2.0” e$BEy$NJ8;zNs$G%U%#!<%I$N%U%)!<%^%C%H$rEO$9e(B
e$B%$%s%?!<%U%'!<%9$O;vee(B RSS::Maker.make(version) {|maker| … }
e$B$7$+$”$j$^$;$s!#e(B(maker = RSS::Maker::XXXXX.new e$BAjEv$,$G$-$J$$e(B)

e$B!!$7$+$7!"e(BRSSe$B$N@8@.$,=hM}$N<g4c$G$J$$>l9g$d!“J#?t$Ne(BRSSe$B%U%#!<%I$re(B
e$BF1;~$K:n$C$?$j$9$k>l9g!”%V%m%C%/$NF3F~$,I,?$N%$%s%?!<%U%'!<%9$Oe(B
e$B;H$$$E$i$$$G$9!#e(B

e$B$o$+$j$^$7$?!#e(B

e$B!!$=$3$G!"e(B RSS::Maker.create(version) e$B$N$h$&$J%a%=%C%I$rDI2C$9$ke(B
e$B$N$O$I$&$G$7$g$&$+!#$D$^$j!"e(B

RSS::Maker.createe$B$G$O$J$/!"e(BRSS::Maker.newe$B$G$O$I$&$G$7$g$&$+!)e(B
e$B;zLLE*$K$Oe(Bcreatee$B$h$j$be(Bnewe$B$NJ}$,<+A3$J5$$,$7$^$9!#%b%8%e!<%ke(B
e$B$Ke(Bnewe$B$r$9$k$N$d!"e(Bnewe$B$GJV$C$F$/$k%*%V%8%'%/%H$,%l%7!<%P$N%/%ie(B
e$B%9$G$O$J$$$N$O5$;}$A0-$$$G$9$,!#!#!#e(B

At Thu, 27 Nov 2008 19:11:01 +0900,
Kouhei S. wrote:

使いづらいです。

わかりました。

 そこで、 RSS::Maker.create(version) ã®ã‚ˆã†ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’è¿½åŠ ã™ã‚‹
のはどうでしょうか。つまり、

RSS::Maker.createではなく、RSS::Maker.newではどうでしょうか?
字面的にはcreateよりもnewの方が自然な気がします。モジュール
にnewをするのや、newで返ってくるオブジェクトがレシーバのクラ
スではないのは気持ち悪いですが。。。

 私にとっては、特に後者の気持ち悪さが致命的なレベルでした。

 create は Factory Method パターンでも new Klass() をラップする
インスタンス生成メソッド名によく使われる語なので、違和感はないと
思いました。

 
 もし気にされるのであれば、クラスを返すメソッド(以前の仕様では
RSS::Maker.maker がそれでした)をたとえば class_for() のような
名前で用意した方が柔軟かもしれません。

rssmaker = RSS::Maker.class_for(version).new

という具合です。

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37221] Re: RSS::Maker.create(version)” on Fri, 28 Nov 2008
17:45:21 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B!!$=$3$G!"e(B RSS::Maker.create(version) e$B$N$h$&$J%a%=%C%I$rDI2C$9$ke(B
e$B$N$O$I$&$G$7$g$&$+!#$D$^$j!"e(B

RSS::Maker.createe$B$G$O$J$/!"e(BRSS::Maker.newe$B$G$O$I$&$G$7$g$&$+!)e(B
e$B;zLLE*$K$Oe(Bcreatee$B$h$j$be(Bnewe$B$NJ}$,<+A3$J5$$,$7$^$9!#%b%8%e!<%ke(B
e$B$Ke(Bnewe$B$r$9$k$N$d!"e(Bnewe$B$GJV$C$F$/$k%*%V%8%'%/%H$,%l%7!<%P$N%/%ie(B
e$B%9$G$O$J$$$N$O5$;}$A0-$$$G$9$,!#!#!#e(B

e$B!!;d$K$H$C$F$O!"FC$K8e<T$N5$;}$A0-$5$,CWL?E*$J%l%Y%k$G$7$?!#e(B

e$B$o$+$j$^$7$?!#e(B

e$B!!e(Bcreate e$B$Oe(B Factory Method e$B%Q%?!<%s$G$be(B new Klass() e$B$r%i%C%W$9$ke(B
e$B%$%s%9%?%s%9@8@.%a%=%C%IL>$K$h$/;H$o$l$k8l$J$N$G!"0cOB46$O$J$$$He(B
e$B;W$$$^$7$?!#e(B

e$B<B$r8@$&$H!“;d$Oe(BFactory Methode$B%Q%?!<%s$,$”$^$j9%$-$G$O$J$$$se(B
e$B$G$9!#$=$l$O!"e(Bnew
Klass()e$B$Ne(BKlasse$B$NItJ,$r%Q%i%a!<%?2=$G$-$J$$e(B
e$B8@8l$G$7$+$?$J$/;H$&$b$N$@$H;W$C$F$$$F!"e(BRubye$B$N$h$&$Ke(BKlasse$B$Ne(B
e$BItJ,$,%Q%i%a!<%?2=$G$-$k8@8l$G$O;H$o$J$/$F$b$h$$$H;W$C$F$$$^e(B
e$B$9!#e(B

e$B!!$b$75$$K$5$l$k$N$G$“$l$P!”%/%i%9$rJV$9%a%=%C%Ie(B(e$B0JA0$N;EMM$G$Oe(B
RSS::Maker.maker e$B$,$=$l$G$7$?e(B)e$B$r$?$H$($Pe(B class_for() e$B$N$h$&$Je(B
e$BL>A0$GMQ0U$7$?J}$,=@Fp$+$b$7$l$^$;$s!#e(B

rssmaker = RSS::Maker.class_for(version).new

e$B$H$$$&6q9g$G$9!#e(B

e$B$3$l$b$J$N$G$9$,!“<B$r8@$&$H!”;d$Oe(BXXX_fore$B$H$+%a%=%C%IL>$Ke(Bfor
e$B$de(Bwithe$B$J$I$D$J$.$N8l$rF~$l$k$N$,$“$^$j9%$-$G$O$J$$$s$G$9!#$=e(B
e$B$s$J$K1Q8l$NJ8K!$N$h$&$K$9$kI,MW$,$”$k$N$+$J$!$H;W$C$F$$$F!"e(B
e$B$D$J$.$N8l$rF~$l$J$/$F$b$o$+$k$h$&$J=q$-J}$NJ}$,9%$_$@$C$?$je(B
e$B$7$^$9!#e(B

e$B!Je(Bfore$B$H$+e(Bwithe$B$r;H$C$F$$$^$;$s$,!"!KNc$($P!"e(B

person.is.boy?

e$B$H$+e(B

person.is_boy?

e$B$h$j$be(B

person.boy?

e$B$NJ}$,!“$9$C$-$j$7$F$$$k$H$$$&$+!”$=$l$G==J,0UL#$,$o$+$k$H;W$Ce(B
e$B$F$$$^$9!#e(B

e$BOC$rLa$7$^$9!#e(B
1e$B$D0F$r;W$$$D$$$?$N$G$9$,!"e(B

maker = RSS::Maker(version).new

e$B$H$$$&$N$O$I$&$G$7$g$&$+!)e(B

URIe$B$O$3$N$h$&$Je(BAPIe$B$@$C$?$H;W$$$^$9!#e(B
e$B!Je(BURIe$B%%V%8%'%/%H$8$c$J$/!"e(BURI::HTTPe$B$de(BURI::FTPe$B%%V%8%'%/%H$Je(B
e$B$I$rJV$9!#!Ke(B

At Sat, 29 Nov 2008 17:18:20 +0900,
Kouhei S. wrote:

スではないのは気持ち悪いですが。。。
です。それは、new Klass()のKlassの部分をパラメータ化できない
言語でしかたなく使うものだと思っていて、RubyのようにKlassの
部分がパラメータ化できる言語では使わなくてもよいと思っていま
す。

 Factory Methodパターンはさておき、せめて

    RSS::Maker.new(version).is_a?(RSS::Maker)

ã¯å­—é¢çš„ã«ã‚‚æˆç«‹ã—ã¦ã»ã—ã„ã®ã§ã™ãŒã€ä»Šã®æ§‹æˆãƒ»æ§‹é€ ã ã¨å„ã‚¯ãƒ©ã‚¹ãŒ
include RSS::Maker するというのは、実装上は可能だけれども意味的に
無理がありますよね。

 してみると、上記の「前者」も絡んだ言語仕様との折り合い上の限界、
と言えるのかもしれません。

んなに英語の文法のようにする必要があるのかなぁと思っていて、
つなぎの語を入れなくてもわかるような書き方の方が好みだったり
します。

 それはわかります。class_for は例なので冗舌な表現でした。

話を戻します。
1つ案を思いついたのですが、

maker = RSS::Maker(version).new

というのはどうでしょうか?

URIはこのようなAPIだったと思います。
(URIオブジェクトじゃなく、URI::HTTPやURI::FTPオブジェクトな
どを返す。)

 URI() が返すのはインスタンスですね。クラスと同名のメソッドが
具象クラスを返す例としては Digest があり、実はそれも考えました。
ただ、 RSS::Maker に関してひっかかったのは、将来的に :: は定数の
参照のみとし、メソッド呼び出しは . に統一しようという提案が以前
一定の賛同を得ていた気がすることです。

 まあ、 ::() という名前のメソッドを定義できるようにする、という
ような救済方法もあり得ますし、今は気にしなくていいのかも。

 私は RSS::Maker(version) という案には賛成です。

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37232] Re: RSS::Maker.create(version)” on Sat, 29 Nov 2008
17:18:20 +0900,
Kouhei S. [email protected] wrote:

1e$B$D0F$r;W$$$D$$$?$N$G$9$,!"e(B

maker = RSS::Maker(version).new

e$B$H$$$&$N$O$I$&$G$7$g$&$+!)e(B

URIe$B$O$3$N$h$&$Je(BAPIe$B$@$C$?$H;W$$$^$9!#e(B
e$B!Je(BURIe$B%%V%8%'%/%H$8$c$J$/!"e(BURI::HTTPe$B$de(BURI::FTPe$B%%V%8%'%/%H$Je(B
e$B$I$rJV$9!#!Ke(B

newe$B$O$$$j$^$;$s$G$7$?!#!#!#e(B

maker = RSS::Maker(version)

e$B$G$9!#e(B

At Sat, 29 Nov 2008 17:22:21 +0900,
Kouhei S. wrote:

というのはどうでしょうか?
です。
 RSS::Maker() はクラスを返した方が自然に思えます。Digest() と
近いクラス構成・位置づけなのでそう感じるだけかも知れませんが。

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37238] Re: RSS::Maker.create(version)” on Mon, 1 Dec 2008
11:32:31 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B!!e(BURI() e$B$,JV$9$N$O%$%s%9%?%s%9$G$9$M!#%/%i%9$HF1L>$N%a%=%C%I$,e(B
e$B6q>]%/%i%9$rJV$9Nc$H$7$F$Oe(B Digest e$B$,$“$j!”<B$O$=$l$b9M$($^$7$?!#e(B
e$B$?$@!“e(B RSS::Maker e$B$K4X$7$F$R$C$+$+$C$?$N$O!”>-MhE*$Ke(B :: e$B$ODj?t$Ne(B
e$B;2>H$N$_$H$7!"%a%=%C%I8F$S=P$7$Oe(B . e$B$KE}0l$7$h$&$H$$$&Ds0F$,0JA0e(B
e$B0lDj$N;?F1$rF@$F$$$?5$$,$9$k$3$H$G$9!#e(B

e$B!!$^$“!“e(B ::() e$B$H$$$&L>A0$N%a%=%C%I$rDj5A$G$-$k$h$&$K$9$k!”$H$$$&e(B
e$B$h$&$J5_:QJ}K!$b$”$jF@$^$9$7!":#$O5$$K$7$J$/$F$$$$$N$+$b!#e(B

e$B!!;d$Oe(B RSS::Maker(version) e$B$H$$$&0F$K$O;?@.$G$9!#e(B

e$B$b$&e(B1e$B$D;W$$$D$$$?$N$G$9$,!"$3$l$G$O$I$&$G$7$g$&$+!)e(B

maker = RSS::Maker[version].new

or

maker = RSS::MAKERS[version].new

e$B$3$C$A$NJ}$,JQ$J$3$H$r$7$F$$$J$$$h$&$K8+$($k5$$,$7$^$9!#e(B

At Mon, 1 Dec 2008 21:48:34 +0900,
Kouhei S. wrote:

In [email protected]
“[ruby-dev:37238] Re: RSS::Maker.create(version)” on Mon, 1 Dec 2008 11:32:31 +0900,
“Akinori MUSHA” [email protected] wrote:
(snip)
こっちの方が変なことをしていないように見える気がします。
確かにハッシュだと変なことをしていないように見えますが、むしろ
将来高度なこと、たとえば version 文字列に表記揺れを認めるとか、
è¿½åŠ ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã‚’å–ã‚Šã€(クラスでなく) new/make メソッドを持つ
オブジェクトを生成して返すとか、モジュールを動的ロード化する
とか、そういうことを実現する際の足かせになる懸念があります。

もちろん . や Hash#default_proc で対応は可能でしょうが、
それこそ変なことをしていると言われそうです。

従って、ハッシュ(に見えるもの)を露出させるよりもメソッドとして
提供する方がインターフェースとしては好ましいと私は思います。

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37246] Re: RSS::Maker.create(version)” on Tue, 2 Dec 2008
20:31:11 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B3N$+$K%O%C%7%e$@$HJQ$J$3$H$r$7$F$$$J$$$h$&$K8+$($^$9$,!“$`$7$me(B
e$B>-Mh9bEY$J$3$H!”$?$H$($Pe(B version e$BJ8;zNs$KI=5-MI$l$rG’$a$k$H$+!“e(B
e$BDI2C%Q%i%a!<%?$r<h$j!“e(B(e$B%/%i%9$G$J$/e(B) new/make e$B%a%=%C%I$r;}$De(B
e$B%%V%8%'%/%H$r@8@.$7$FJV$9$H$+!"%b%8%e!<%k$rF0E%m!<%I2=$9$ke(B
e$B$H$+!”$=$&$$$&$3$H$r<B8=$9$k:]$NB-$+$;$K$J$k7|G0$,$”$j$^$9!#e(B

e$B$b$A$m$se(B . e$B$de(B Hash#default_proc e$B$GBP1~$O2DG=$G$7$g$&$,!"e(B
e$B$=$l$3$=JQ$J$3$H$r$7$F$$$k$H8@$o$l$=$&$G$9!#e(B

RSS::MAKERSe$B$H$$$&%O%C%7%e$,$b$&$9$G$K$“$k>uBV$G!”@bL@$J$7$Ke(B
RSS::MAKERS[]e$B$H$$$&%3!<%I$r$@$7$?$N$O<:GT$G$7$?!#$9$_$^$;$s!#e(B

e$B%O%C%7%e$G$O$J$/e(B[]e$B$r;}$D%%V%8%'%/%H$rMQ0U$9$k$D$b$j$G$7$?!#e(B
e$B;d$O!“e(B[]e$B$O%O%C%7%e$C$]$/8+$;$k$b$N$H$$$&$h$j$b!”%3%s%F%J$C$]e(B
e$B$$%
%V%8%'%/%H$X$N0lHLE*$J%“%/%;%95-K!$@$H;W$C$F$$$^$9!#!V2?e(B
e$B$+$r2C$($k!&7k9g$9$k!WF0:n0lHL$K!Ve(B+e$B!W$r;H$&$h$&$J463P$G$9!#e(B
e$B!JNc$,$h$$$+$I$&$+$O$”$^$j<+?.$,$"$j$^$;$s!#$4$a$s$J$5$$!#!Ke(B

RSS::Maker[version].newe$B$Ge(BRSS::Makere$B$r;H$C$F$$$k$N$O!“8=;~E@e(B
e$B$G$Oe(BRSS::Makere$B$,M#0l30$K$G$F$$$k%*%V%8%'%/%H$J$N$G!”$=$$$D$,e(B
e$B%(%s%H%j%]%$%s%H$K$J$k$H$h$$$H;W$C$?$+$i$G$9!#e(B

RSS::MAKERS[version].newe$B$NJ}$O!"e(BMAKERSe$B$H$$$&J#?t7A$NJ}$,%3%se(B
e$B%F%J$C$]$5$,$G$k$+$H;W$C$?$+$i$G$9!#e(B

[]e$B$G!J>/$7!)!K9bEY$J<hF@=hM}$r<B9T$9$k$N$O$=$l$[$IDA$7$$$3$He(B
e$B$G$O$J$$$H;W$$$^$9!#e(B

e$BNc$($P!"e(BHTTPe$B%X%C%@$r<hF@$9$ke(BAPIe$B$H$7$Fe(B[]
e$B$r;HMQ$7$F$$$k%*%V%8%'e(B
e$B%/%H$G$O%-!<!Je(BHTTPe$B%X%C%@$NL>A0!K$r@55,2=$7$FCM$rJV$7$F$$$^$9!#e(B
e$B!Je(Bnet/http.rbe$B$Ne(BNet::HTTPHeadere$B!"e(Bxmlrpc/httpserver.rbe$B$Ne(B
HttpServer::Tablee$B!"e(Bwebrick/httprequest.rbe$B$Ne(B
WEBrick::HTTPRequeste$B!Ke(B

Array#[]e$B$O!"$b$C$H9bEY$G%$%s%G%C%/%9$r$H$k$@$1$G$O$J$/!"3+;Oe(B
e$B0LCV$HD9$5$Ne(B2e$B0z?t$r$H$C$?$j!"e(BRangee$B$r$H$C$?$j$b$7$^$9!#e(B

e$B$H$$$&$3$H$G!";d$O%P!<%8%g%sJ8;zNs$+$iBP1~$9$ke(Bmakere$B%/%i%9$re(B
e$B<hF@$9$k$N$K$Oe(B[]e$B$,$h$$$+$H;W$C$F$$$^$7$?!#e(B

e$B$A$J$$K!"8=:$G$be(BRSS::Maker.makee$B$Oe(Bversione$BJ8;zNs$NI=5-MI$l$re(B
e$BG’$a$F$$$?$j$7$^$9!#e(B

e$B=>$C$F!"%O%C%7%ee(B(e$B$K8+$($k$b$Ne(B)e$B$rO*=P$5$;$k$h$j$b%a%=%C%I$H$7$Fe(B
e$BDs6!$9$kJ}$,%$%s%?!<%U%'!<%9$H$7$F$O9%$^$7$$$H;d$O;W$$$^$9!#e(B

RSS::Maker.finde$B$O$I$&$G$7$g$&$+!#e(B

At Mon, 8 Dec 2008 20:28:44 +0900,
Kouhei S. wrote:

もう1つ思いついたのですが、これではどうでしょうか?

maker = RSS::Maker[version].new

or

maker = RSS::MAKERS[version].new

こっちの方が変なことをしていないように見える気がします。
(snip)
ハッシュではなく[]を持つオブジェクトを用意するつもりでした。
私は、[]はハッシュっぽく見せるものというよりも、コンテナっぽ
いオブジェクトへの一般的なアクセス記法だと思っています。「何
ã‹ã‚’åŠ ãˆã‚‹ãƒ»çµåˆã™ã‚‹ã€å‹•ä½œä¸€èˆ¬ã«ã€Œ+」を使うような感覚です。
(例がよいかどうかはあまり自信がありません。ごめんなさい。)

RSS::Maker[version].newでRSS::Makerを使っているのは、現時点
ではRSS::Makerが唯一外にでているオブジェクトなので、そいつが
エントリポイントになるとよいと思ったからです。

 なるほど。module の [] というのはどうだろうと思ったんですが、
意外といいかもしれませんね。RSS::Maker の中というのは(同名の
メソッドよりは)収まりがいいです。

WEBrick::HTTPRequest)

Array#[]は、もっと高度でインデックスをとるだけではなく、開始
位置と長さの2引数をとったり、Rangeをとったりもします。

 私の感覚を言うと、 [] を使うときは何のインスタンスかを意識して
いるような気がします。RSS::MAKERS[…] と書いたときは MAKERS が
いったい何なのか気になりますが、定数然とした見た目なので Array か
Hash だろうという感じなので、クラスを引くための特別なオブジェクト
です、と言われたら少し大仰な印象を受けそうです。

ということで、私はバージョン文字列から対応するmakerクラスを
取得するのには[]がよいかと思っていました。

 RSS::Maker[] の方は、 RSS::Maker が module と知っているので、
[] の中で何が行われても違和感を覚えません。

 感覚的な話ばかりで恐縮ですが…。

(snip)

従って、ハッシュ(に見えるもの)を露出させるよりもメソッドとして
提供する方がインターフェースとしては好ましいと私は思います。

RSS::Maker.findはどうでしょうか。

 気分的には find よりは get とか、いっそ of くらいの距離感が
しっくり来ますが、 Encoding も find なので悪くないと思います。

 ということで RSS::Maker[], RSS::Maker.find() ともに賛成です。

At Wed, 10 Dec 2008 21:44:53 +0900,
Kouhei S. wrote:

デフォルトでは、RSS::Maker::RSS09クラスは0.92用のRSSを生成し
ます。0.91用のRSSを生成するためには明示的に0.91を指定する必
è¦ãŒã‚ã‚Šã€ãã®å ´åˆã¯ã“ã®ã‚ˆã†ã«æ›¸ã‹ãªã‘ã‚Œã°ã„ã‘ãªããªã‚Šã¾ã™ã€‚

maker = RSS::Maker[“0.91”].new(“0.91”)

参考: 0.92ã®å ´åˆ

maker = RSS::Maker[“0.92”].new

 なるほど…。new()でも引数を取るのはどうしてだろうと思ったら
そういうことでしたか。まったく意識から抜けていました。

 RSS::Maker[“0.9”].new(“0.91”) という形ならありだと思います。

 しかし、 0.91 と 0.92 のクラスが同じで new() の引数で分ける、
という実装上の都合はあまり利用者には意識させたくないですね。

 0.91 用にサブクラスを作り、 RSS::Maker[“0.91”] と指定されたら
それを返すようにした方がいいかもしれません。

そのため、RSS::Maker[]でクラスを返すのではなく、オブジェクト
を返してこのように使えた方がよい気がするのですが、これでもよ
いでしょうか?

maker = RSS::Maker[“0.91”]

 コンテナの中身に(同じキーで)アクセスすると毎回新しいものが
出てくるというのは、少し違和感があるかも…。

 インスタンスを返す形だと、始めに戻ってしまいますが

maker = RSS::Maker.create("0.91")

の方が読みやすく感じます。create という語にはやはり強い抵抗を
お感じになるでしょうか。

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37333] Re: RSS::Maker.create(version)” on Tue, 9 Dec 2008
19:15:04 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B!!$H$$$&$3$H$Ge(B RSS::Maker[], RSS::Maker.find() e$B$H$b$K;?@.$G$9!#e(B

RSS::Maker[]e$B$NJ}$G%3%_%C%H$7$^$7$?!#e(B

e$B$G!“%3%_%C%H$7$F$+$i5$IU$$$F$7$^$C$?$N$G$9$,!“e(BRSS::Maker[]e$B$Ge(B
e$B$O%/%i%9$G$O$J$/%*%V%8%'%/%H$rJV$7$?J}$,;H$$$d$9$=$&$J5$$,$7e(B
e$B$^$7$?!#!J:#$O%/%i%9$G$9$i$J$/!”%/%i%9$H%P!<%8%g%s$r;}$C$F$$e(B
e$B$k%O%C%7%e$rJV$9$h$&$K$7$F$7$^$C$?$N$G!”$$$:$l$K$7$F$b8e$GD>e(B
e$B$7$^$9!#!Ke(B

makere$B%*%V%8%'%/%H$r:n$k$H$-$O%U%#!<%I$N%P!<%8%g%s$r0z?t$KM?$(e(B
e$B$k$3$H$,$G$-$k$N$G$-$^$9!#$3$l$O!"e(BRSS 0.91e$B$He(B0.92e$B$rF1$8e(B
RSS::Maker::RSS09e$B%/%i%9$GBP1~$7$F$$$k$?$a$G$9!#e(B

e$B%G%U%)%k%H$G$O!“e(BRSS::Maker::RSS09e$B%/%i%9$Oe(B0.92e$BMQ$Ne(BRSSe$B$r@8@.$7e(B
e$B$^$9!#e(B0.91e$BMQ$Ne(BRSSe$B$r@8@.$9$k$?$a$K$OL@<(E*$Ke(B0.91e$B$r;XDj$9$kI,e(B
e$BMW$,$”$j!"$=$N>l9g$O$3$N$h$&$K=q$+$J$1$l$P$$$1$J$/$J$j$^$9!#e(B

maker = RSS::Maker[“0.91”].new(“0.91”)

e$B;29Me(B: 0.92e$B$N>l9ge(B

maker = RSS::Maker[“0.92”].new

e$B$=$N$?$a!“e(BRSS::Maker[]e$B$G%/%i%9$rJV$9$N$G$O$J$/!”%*%V%8%'%/%He(B
e$B$rJV$7$F$3$N$h$&$K;H$($?J}$,$h$$5$$,$9$k$N$G$9$,!"$3$l$G$b$he(B
e$B$$$G$7$g$&$+!)e(B

maker = RSS::Maker[“0.91”]

e$B?\F#$G$9!#e(B

In [email protected]
“[ruby-dev:37349] Re: RSS::Maker.create(version)” on Wed, 10 Dec 2008
22:22:07 +0900,
“Akinori MUSHA” [email protected] wrote:

e$B!!e(BRSS::Maker[“0.9”].new(“0.91”) e$B$H$$$&7A$J$i$"$j$@$H;W$$$^$9!#e(B

e$B!!$7$+$7!"e(B 0.91 e$B$He(B 0.92 e$B$N%/%i%9$,F1$8$Ge(B new() e$B$N0z?t$GJ,$1$k!“e(B
e$B$H$$$&e$NET9g$O$”$^$jMxMQ<T$K$O0U<1$5$;$?$/$J$$$G$9$M!#e(B

e$B!!e(B0.91 e$BMQ$K%5%V%/%i%9$r:n$j!"e(B RSS::Maker[“0.91”] e$B$H;XDj$5$l$?$ie(B
e$B$=$l$rJV$9$h$&$K$7$?J}$,$$$$$+$b$7$l$^$;$s!#e(B

e$B$?$7$+$K$=$N$h$&$J5$$,$7$?$N$G!“$=$&$7$^$7$?!#e(B
e$B$”$j$,$H$&$4$6$$$^$9!#e(B

e$B!!%$%s%9%?%s%9$rJV$97A$@$H!";O$a$KLa$C$F$7$^$$$^$9$,e(B

maker = RSS::Maker.create("0.91")

e$B$NJ}$,FI$_$d$9$/46$8$^$9!#e(Bcreate e$B$H$$$&8l$K$O$d$O$j6/$$Dq93$re(B
e$B$*46$8$K$J$k$G$7$g$&$+!#e(B

e$B$O$$!"0c$&$h$&$J46$8$,$7$F$7$^$$$^$9!#e(B

RSS::Makere$B$Ke(Bmakee$B$He(Bcreatee$B$H$$$&F1$8$h$&$J:n$k$H$$$&0UL#$N%a%=%Ce(B
e$B%I$,e(B2e$B$D$G$-$k$+$i$+$b$7$l$^$;$s!#e(B

e$B$"$k$$$O!"e(BRSS::Makere$B$,e(Bcreatee$B$9$k$J$i!"e(BRSS::Makere$B%*%V%8%'%/%He(B
e$B$G$O$J$/$F!"e(BRSSe$B%U%#!<%I$r:n$k$h$&$J5$$,$7$F$7$^$&$+$i$+$b$7$le(B
e$B$^$;$s!#e(B

At Thu, 11 Dec 2008 21:05:42 +0900,
Kouhei S. wrote:

それを返すようにした方がいいかもしれません。

たしかにそのような気がしたので、そうしました。
ありがとうございます。

 長々とお付き合いいただきありがとうございました。

 自然なAPIで目的が達成できたので満足です。