[#21157] あったらうれしいメソッド to_n, to_n!, to_s! — ogino@...

荻野です。あったらうれしいメソッドということで書いてみます。

16 messages 2000/03/03

[#21159] メソッドの入り口 — ogino@...

荻野です。もうひとつご指導ください。

93 messages 2000/03/03
[#21170] Re: メソッドの入り口 — Shin-ichiro Hara <sinara@...> 2000/03/03

原です。

[#21243] Re: メソッドの入り口 — keiju@... (石塚圭樹) 2000/03/07

けいじゅ@日本ラショナルソフトウェアです.

[#21247] Re: メソッドの入り口 — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/03/07

[#21267] 引数コピーとオブジェクト指向 (Re: メソッドの入り口) — Hideto ISHIBASHI <s34204@...> 2000/03/08

石橋秀仁です。

[#21272] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/03/08

[#21276] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — nobu.nakada@... 2000/03/09

なかだです。

[#21279] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — ogino@... 2000/03/09

oop未満の世界観の荻野です。

[#21282] Re: 引数コピーとオブジェクト指向 — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp> 2000/03/09

越水です。

[#21285] Re: 引数コピーとオブジェクト指向 — ogino@... 2000/03/10

荻野です。

[#21293] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/10

松尾です。

[#21297] Re: 引数コピーとオブジェクト指向 — ogino@... 2000/03/10

荻野です。

[#21302] Re: 引数コピーとオブジェクト指向 — 土岐 仁謙 <toki@...> 2000/03/10

土岐です。

[#21371] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/13

松尾です。

[#21374] Re: 引数コピーとオブジェクト指向 — TADA Tadashi <sho@...> 2000/03/13

ただただしです。

[#21365] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/13

松尾です。

[#21280] raise non-Exception object — Kenichi Komiya <kom@...3.rim.or.jp>

24 messages 2000/03/09
[#21283] Re: raise non-Exception object — nobu.nakada@... 2000/03/09

なかだです。

[#21315] Re: raise non-Exception object — Kenichi Komiya <kom@...3.rim.or.jp> 2000/03/11

[#21342] Re: raise non-Exception object — nobu.nakada@... 2000/03/12

なかだです。

[#21384] ruby 1.4.4 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

35 messages 2000/03/13

[#21442] 配列内のソート — Takayuki Tanaka <tanaka@...>

こんにちは Tanです。

16 messages 2000/03/15

[#21583] ruby for Web — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

27 messages 2000/03/22
[#21584] Re: ruby for Web — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/03/22

なひです.

[#21649] net-1.1.10 — TAKAHASHI Masayoshi <maki@...>

高橋征義です。net/http 使いたおし中。

17 messages 2000/03/27

[#21669] new version of mod_ruby & eRuby — Shugo Maeda <shugo@...>

前田です。

14 messages 2000/03/28

[ruby-list:21671] GoF's Flyweight Pattern

From: Hideto ISHIBASHI <hideto-i@...4u.or.jp>
Date: 2000-03-28 10:44:35 UTC
List: ruby-list #21671
石橋秀仁です。

"Gang of Four"の"Flyweight"というデザインパターンを試しに
実装してみました。まだいろいろと問題がありそうなので、
御意見ください。

(注)Flyweight Patternとは(引用)
「多数の細かいオブジェクトを効率良くサポートするために共有を利用する」

# ほんとは共有しているobjectを、変更される直前にcloneできれば。
# 複数のオブジェクトから参照されている場合の、副作用の心配が
# 無くなります。例の「dup問題」も解決します。
# インスタンス変数にtrace_varのような操作はできないのでしょうか?

また、これを使ってRuby本のlifegame.rbとgeometry.rbを書換えてみました。
Ruby本p.272の「#(A')@neighborsの初期化」のように(素直に)記述しても、
「配列が余分にコピーされ」なくなります。

# そのパッチを流してもよろしいですか?>著者様

--
Hideto "rubyholic" ISHIBASHI

Attachments (1)

flyweight.rb (2.27 KB, text/x-ruby)
#  GoF's FLYWEIGHT PATTERN
# Copyright (c) 2000 Hideto ISHIBASHI <hideto-i@rr.iij4u.or.jp>
#
# Flyweight module that enables a large number of small objects to be shared.
#
# 1) It uses parameters of the `initialize' as hash keys.
# 2) Objects created by direct call of "Class#new" are not shared.
# 3) Attributes of flyweights should not be changed after creation.
#   Remember all the objects that have the same key are shared.
#
# The followings are defined in a class/module that includes Flyweight.
#  class instance variable: @__pool__
#  class methods: __create_flyweight__, __remove_flyweight__,
#                 alias_create_flyweight, alias_remove_flyweight

module Flyweight

  def Flyweight.append_features(klass)
    klass.instance_eval %{
      @__pool__ = {}

      def __create_flyweight__(*key)
        if @__pool__.has_key?(key)
          @__pool__[key]
        else
          @__pool__[key] = new_obj = new(*key)
          new_obj
        end
      end

      def __remove_flyweight__(*key)
        @__pool__.delete(key)
      end
    }

    ["create", "remove"].each {|method_name|
      klass.instance_eval %{
        def alias_#{method_name}_flyweight(alias_name)
          alias_name = alias_name.id2name if alias_name.kind_of?(Integer)
          instance_eval %{ alias #\{alias_name\} __#{method_name}_flyweight__ }
        end
      }
    }
  end

end


if __FILE__ == $0

  def ok?(condition)
    raise "NG!" unless condition
  end

  class Foo

    include Flyweight

    alias_create_flyweight :create
    alias_remove_flyweight :remove

    def initialize(str)
      @str = str
    end
    attr_accessor :str           # DANGER! Attributes should not be changed.
    # attr_reader :str           # This is ok.

  end

  foo  = Foo.create("foo")
  foo2 = Foo.create("foo")
  foo3 = Foo.new("foo")

  ok? foo.str == foo2.str
  ok? foo.equal?(foo2)
  ok? foo.str == foo3.str
  #ok? foo.equal?(foo3)          # NG (foo3 is created by Class#new)

  # 2 way to change foo2.str => "foofoo"
  begin
    foo2.str = "foofoo"          # (*a) DANGER!
    ok? foo.str == "foo"         # (*b) NG (foo is changed unexpectedly)
  rescue
    foo.str  = "foo"
  end

  # again with a safe manner
  ok? foo.str == foo2.str
  foo2 = Foo.create("foofoo")    # (*a) SAFE
  ok? foo.str == "foo"           # (*b) OK

end

In This Thread

Prev Next