Forum: Ruby-dev RSS::Maker.create(version)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-11-27 07:27
(Received via mailing list)
 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)
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-11-27 11:16
(Received via mailing list)
$B?\F#$G$9!#(B

In <86wsepvg3y.knu@iDaemons.org>
  "[ruby-dev:37210] RSS::Maker.create(version)" on Thu, 27 Nov 2008
15:22:05 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

> $B!!(BRSS::Maker $B$G!"(B "2.0" $BEy$NJ8;zNs$G%U%#!<%I$N%U%)!<%^%C%H$rEO$9(B
> $B%$%s%?!<%U%'!<%9$O;v<B>e(B RSS::Maker.make(version) {|maker| ... }
> $B$7$+$"$j$^$;$s!#(B(maker = RSS::Maker::XXXXX.new $BAjEv$,$G$-$J$$(B)
>
> $B!!$7$+$7!"(BRSS$B$N@8@.$,=hM}$N<g4c$G$J$$>l9g$d!"J#?t$N(BRSS$B%U%#!<%I$r(B
> $BF1;~$K:n$C$?$j$9$k>l9g!"%V%m%C%/$NF3F~$,I,?\$N%$%s%?!<%U%'!<%9$O(B
> $B;H$$$E$i$$$G$9!#(B

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

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

RSS::Maker.create$B$G$O$J$/!"(BRSS::Maker.new$B$G$O$I$&$G$7$g$&$+!)(B
$B;zLLE*$K$O(Bcreate$B$h$j$b(Bnew$B$NJ}$,<+A3$J5$$,$7$^$9!#%b%8%e!<%k(B
$B$K(Bnew$B$r$9$k$N$d!"(Bnew$B$GJV$C$F$/$k%*%V%8%'%/%H$,%l%7!<%P$N%/%i(B
$B%9$G$O$J$$$N$O5$;}$A0-$$$G$9$,!#!#!#(B
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-11-28 09:51
(Received via mailing list)
At Thu, 27 Nov 2008 19:11:01 +0900,
Kouhei Sutou 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

という具合です。
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-11-29 09:24
(Received via mailing list)
$B?\F#$G$9!#(B

In <86tz9sutdc.knu@iDaemons.org>
  "[ruby-dev:37221] Re: RSS::Maker.create(version)" on Fri, 28 Nov 2008
17:45:21 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

> > > $B!!$=$3$G!"(B RSS::Maker.create(version) $B$N$h$&$J%a%=%C%I$rDI2C$9$k(B
> > > $B$N$O$I$&$G$7$g$&$+!#$D$^$j!"(B
> >
> > RSS::Maker.create$B$G$O$J$/!"(BRSS::Maker.new$B$G$O$I$&$G$7$g$&$+!)(B
> > $B;zLLE*$K$O(Bcreate$B$h$j$b(Bnew$B$NJ}$,<+A3$J5$$,$7$^$9!#%b%8%e!<%k(B
> > $B$K(Bnew$B$r$9$k$N$d!"(Bnew$B$GJV$C$F$/$k%*%V%8%'%/%H$,%l%7!<%P$N%/%i(B
> > $B%9$G$O$J$$$N$O5$;}$A0-$$$G$9$,!#!#!#(B
>
> $B!!;d$K$H$C$F$O!"FC$K8e<T$N5$;}$A0-$5$,CWL?E*$J%l%Y%k$G$7$?!#(B

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

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

$B<B$r8@$&$H!";d$O(BFactory Method$B%Q%?!<%s$,$"$^$j9%$-$G$O$J$$$s(B
$B$G$9!#$=$l$O!"(Bnew
Klass()$B$N(BKlass$B$NItJ,$r%Q%i%a!<%?2=$G$-$J$$(B
$B8@8l$G$7$+$?$J$/;H$&$b$N$@$H;W$C$F$$$F!"(BRuby$B$N$h$&$K(BKlass$B$N(B
$BItJ,$,%Q%i%a!<%?2=$G$-$k8@8l$G$O;H$o$J$/$F$b$h$$$H;W$C$F$$$^(B
$B$9!#(B

> $B!!$b$75$$K$5$l$k$N$G$"$l$P!"%/%i%9$rJV$9%a%=%C%I(B($B0JA0$N;EMM$G$O(B
> RSS::Maker.maker $B$,$=$l$G$7$?(B)$B$r$?$H$($P(B class_for() $B$N$h$&$J(B
> $BL>A0$GMQ0U$7$?J}$,=@Fp$+$b$7$l$^$;$s!#(B
>
>     rssmaker = RSS::Maker.class_for(version).new
>
> $B$H$$$&6q9g$G$9!#(B

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

$B!J(Bfor$B$H$+(Bwith$B$r;H$C$F$$$^$;$s$,!"!KNc$($P!"(B

  person.is.boy?

$B$H$+(B

  person.is_boy?

$B$h$j$b(B

  person.boy?

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


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

  maker = RSS::Maker(version).new

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

URI$B$O$3$N$h$&$J(BAPI$B$@$C$?$H;W$$$^$9!#(B
$B!J(BURI$B%*%V%8%'%/%H$8$c$J$/!"(BURI::HTTP$B$d(BURI::FTP$B%*%V%8%'%/%H$J(B
$B$I$rJV$9!#!K(B
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-11-29 09:28
(Received via mailing list)
$B?\F#$G$9!#(B

In <20081129.172323.4959786962521860.kou@cozmixng.org>
  "[ruby-dev:37232] Re: RSS::Maker.create(version)" on Sat, 29 Nov 2008
17:18:20 +0900,
  Kouhei Sutou <kou@cozmixng.org> wrote:

> 1$B$D0F$r;W$$$D$$$?$N$G$9$,!"(B
>
>   maker = RSS::Maker(version).new
>
> $B$H$$$&$N$O$I$&$G$7$g$&$+!)(B
>
> URI$B$O$3$N$h$&$J(BAPI$B$@$C$?$H;W$$$^$9!#(B
> $B!J(BURI$B%*%V%8%'%/%H$8$c$J$/!"(BURI::HTTP$B$d(BURI::FTP$B%*%V%8%'%/%H$J(B
> $B$I$rJV$9!#!K(B


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

  maker = RSS::Maker(version)

$B$G$9!#(B
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-01 03:38
(Received via mailing list)
At Sat, 29 Nov 2008 17:18:20 +0900,
Kouhei Sutou 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) という案には賛成です。
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-01 03:59
(Received via mailing list)
At Sat, 29 Nov 2008 17:22:21 +0900,
Kouhei Sutou wrote:
> > というのはどうでしょうか?
> です。
 RSS::Maker() はクラスを返した方が自然に思えます。Digest() 
と
近いクラス構成・位置づけなのでそう感じるだけかも知れませんが。
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-12-01 13:54
(Received via mailing list)
$B?\F#$G$9!#(B

In <86skp8vcvv.knu@iDaemons.org>
  "[ruby-dev:37238] Re: RSS::Maker.create(version)" on Mon, 1 Dec 2008
11:32:31 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

>
> $B!!(BURI() $B$,JV$9$N$O%$%s%9%?%s%9$G$9$M!#%/%i%9$HF1L>$N%a%=%C%I$,(B
> $B6q>]%/%i%9$rJV$9Nc$H$7$F$O(B Digest $B$,$"$j!"<B$O$=$l$b9M$($^$7$?!#(B
> $B$?$@!"(B RSS::Maker $B$K4X$7$F$R$C$+$+$C$?$N$O!">-MhE*$K(B :: $B$ODj?t$N(B
> $B;2>H$N$_$H$7!"%a%=%C%I8F$S=P$7$O(B . $B$KE}0l$7$h$&$H$$$&Ds0F$,0JA0(B
> $B0lDj$N;?F1$rF@$F$$$?5$$,$9$k$3$H$G$9!#(B
>
> $B!!$^$"!"(B ::() $B$H$$$&L>A0$N%a%=%C%I$rDj5A$G$-$k$h$&$K$9$k!"$H$$$&(B
> $B$h$&$J5_:QJ}K!$b$"$jF@$^$9$7!":#$O5$$K$7$J$/$F$$$$$N$+$b!#(B
>
> $B!!;d$O(B RSS::Maker(version) $B$H$$$&0F$K$O;?@.$G$9!#(B

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

  maker = RSS::Maker[version].new

or

  maker = RSS::MAKERS[version].new

$B$3$C$A$NJ}$,JQ$J$3$H$r$7$F$$$J$$$h$&$K8+$($k5$$,$7$^$9!#(B
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-02 12:37
(Received via mailing list)
At Mon, 1 Dec 2008 21:48:34 +0900,
Kouhei Sutou wrote:
> In <86skp8vcvv.knu@iDaemons.org>
>   "[ruby-dev:37238] Re: RSS::Maker.create(version)" on Mon, 1 Dec 2008 11:32:31 +0900,
>   "Akinori MUSHA" <knu@iDaemons.org> wrote:
(snip)
> こっちの方が変なことをしていないように見える気がします。
確かにハッシュだと変なことをしていないように見えますが、むしろ
将来高度なこと、たとえば version 
文字列に表記揺れを認めるとか、
追加パラメータを取り、(クラスでなく) new/make 
メソッドを持つ
オブジェクトを生成して返すとか、モジュールを動的ロード化する
とか、そういうことを実現する際の足かせになる懸念があります。

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

従って、ハッシュ(に見えるもの)を露出させるよりもメソッドとして
提供する方がインターフェースとしては好ましいと私は思います。
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-12-08 12:35
(Received via mailing list)
$B?\F#$G$9!#(B

In <86hc5mvmem.knu@iDaemons.org>
  "[ruby-dev:37246] Re: RSS::Maker.create(version)" on Tue, 2 Dec 2008
20:31:11 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

> $B3N$+$K%O%C%7%e$@$HJQ$J$3$H$r$7$F$$$J$$$h$&$K8+$($^$9$,!"$`$7$m(B
> $B>-Mh9bEY$J$3$H!"$?$H$($P(B version $BJ8;zNs$KI=5-MI$l$rG'$a$k$H$+!"(B
> $BDI2C%Q%i%a!<%?$r<h$j!"(B($B%/%i%9$G$J$/(B) new/make $B%a%=%C%I$r;}$D(B
> $B%*%V%8%'%/%H$r@8@.$7$FJV$9$H$+!"%b%8%e!<%k$rF0E*%m!<%I2=$9$k(B
> $B$H$+!"$=$&$$$&$3$H$r<B8=$9$k:]$NB-$+$;$K$J$k7|G0$,$"$j$^$9!#(B
>
> $B$b$A$m$s(B .[]() $B$d(B Hash#default_proc $B$GBP1~$O2DG=$G$7$g$&$,!"(B
> $B$=$l$3$=JQ$J$3$H$r$7$F$$$k$H8@$o$l$=$&$G$9!#(B

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

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

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

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


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

$BNc$($P!"(BHTTP$B%X%C%@$r<hF@$9$k(BAPI$B$H$7$F(B[]
$B$r;HMQ$7$F$$$k%*%V%8%'(B
$B%/%H$G$O%-!<!J(BHTTP$B%X%C%@$NL>A0!K$r@55,2=$7$FCM$rJV$7$F$$$^$9!#(B
$B!J(Bnet/http.rb$B$N(BNet::HTTPHeader$B!"(Bxmlrpc/httpserver.rb$B$N(B
HttpServer::Table$B!"(Bwebrick/httprequest.rb$B$N(B
WEBrick::HTTPRequest$B!K(B

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


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


$B$A$J$_$K!"8=:_$G$b(BRSS::Maker.make$B$O(Bversion$BJ8;zNs$NI=5-MI$l$r(B
$BG'$a$F$$$?$j$7$^$9!#(B


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


RSS::Maker.find$B$O$I$&$G$7$g$&$+!#(B
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-09 11:22
(Received via mailing list)
At Mon, 8 Dec 2008 20:28:44 +0900,
Kouhei Sutou 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() ともに賛成です。
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-12-10 13:52
(Received via mailing list)
$B?\F#$G$9!#(B

In <86bpvl3ayx.knu@iDaemons.org>
  "[ruby-dev:37333] Re: RSS::Maker.create(version)" on Tue, 9 Dec 2008
19:15:04 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

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

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

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

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

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

  maker = RSS::Maker["0.91"].new("0.91")
  # $B;29M(B: 0.92$B$N>l9g(B
  #   maker = RSS::Maker["0.92"].new

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

  maker = RSS::Maker["0.91"]
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-10 14:29
(Received via mailing list)
At Wed, 10 Dec 2008 21:44:53 +0900,
Kouhei Sutou 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 
という語にはやはり強い抵抗を
お感じになるでしょうか。
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2008-12-11 13:12
(Received via mailing list)
$B?\F#$G$9!#(B

In <867i682m7h.knu@iDaemons.org>
  "[ruby-dev:37349] Re: RSS::Maker.create(version)" on Wed, 10 Dec 2008
22:22:07 +0900,
  "Akinori MUSHA" <knu@iDaemons.org> wrote:

> $B!!(BRSS::Maker["0.9"].new("0.91") $B$H$$$&7A$J$i$"$j$@$H;W$$$^$9!#(B
>
> $B!!$7$+$7!"(B 0.91 $B$H(B 0.92 $B$N%/%i%9$,F1$8$G(B new() $B$N0z?t$GJ,$1$k!"(B
> $B$H$$$&<BAu>e$NET9g$O$"$^$jMxMQ<T$K$O0U<1$5$;$?$/$J$$$G$9$M!#(B
>
> $B!!(B0.91 $BMQ$K%5%V%/%i%9$r:n$j!"(B RSS::Maker["0.91"] $B$H;XDj$5$l$?$i(B
> $B$=$l$rJV$9$h$&$K$7$?J}$,$$$$$+$b$7$l$^$;$s!#(B

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

> $B!!%$%s%9%?%s%9$rJV$97A$@$H!";O$a$KLa$C$F$7$^$$$^$9$,(B
>
>     maker = RSS::Maker.create("0.91")
>
> $B$NJ}$,FI$_$d$9$/46$8$^$9!#(Bcreate $B$H$$$&8l$K$O$d$O$j6/$$Dq93$r(B
> $B$*46$8$K$J$k$G$7$g$&$+!#(B

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

RSS::Maker$B$K(Bmake$B$H(Bcreate$B$H$$$&F1$8$h$&$J:n$k$H$$$&0UL#$N%a%=%C(B
$B%I$,(B2$B$D$G$-$k$+$i$+$b$7$l$^$;$s!#(B

$B$"$k$$$O!"(BRSS::Maker$B$,(Bcreate$B$9$k$J$i!"(BRSS::Maker$B%*%V%8%'%/%H(B
$B$G$O$J$/$F!"(BRSS$B%U%#!<%I$r:n$k$h$&$J5$$,$7$F$7$^$&$+$i$+$b$7$l(B
$B$^$;$s!#(B
74f896b312b786ee75a18073941e2457?d=identicon&s=25 Akinori MUSHA (Guest)
on 2008-12-11 13:24
(Received via mailing list)
At Thu, 11 Dec 2008 21:05:42 +0900,
Kouhei Sutou wrote:
> > それを返すようにした方がいいかもしれません。
>
> たしかにそのような気がしたので、そうしました。
> ありがとうございます。

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

 自然なAPIで目的が達成できたので満足です。
This topic is locked and can not be replied to.