ruby でのCompositeパターンの実装。


キーストン ホーム

前に戻る

ruby で Compositeパターンを実装してみた。
というか、Java 版より先に ruby 版を作ってテストしたが、
PStoreの性能に限界を感じたので、Java版(C#版)のオブジェクトデータベースにいきついた。


# -*- coding: utf-8 -*-

module Komposite
  attr_accessor :childs, :parent

  def add_child(aNode)
    @childs=[] unless @childs
    aNode.parent=self
    @childs.push aNode
    aNode
  end
  def recursive(aDepth=0, &block)
    yield self, aDepth
    if @childs
      aDepth+=1
      @childs.each do |iChild|
        iChild.recursive aDepth, &block
      end
    end
  end
  def recursive2(&block)
    if @childs
      @childs.reverse_each do |iChild|
        iChild.recursive2 &block
      end
    end
    yield self
  end
  def delete_item(&block)
    if @childs
      @childs.reverse_each do |iChild|
        iChild.recursive2 &block
      end
    end

    yield self

    wIndex=self.parent.childs.index(self)
    self.parent.childs.delete_at(wIndex)
  end
end

if __FILE__==$0
    require 'pstore'

    class A
      include Komposite

      attr_accessor :value

      def initialize(aValue)
        @value=aValue
      end
    end

  wNode00=A.new "node00"
  wNode01=A.new "node01"
  wNode011=A.new "node011"
  wNode012=A.new "node012"
  wNode0121=A.new "node0121"
  wNode0122=A.new "node0122" 
  wNode0123=A.new "node0123" 
  wNode01231=A.new "node01231" 
  wNode0124=A.new "node0124"
  wNode0125=A.new "node0125"
  wNode013=A.new "node013"
  wNode02=A.new "node02" 
  wNode03=A.new "node03"
  wNode04=A.new "node04"
  wNode00.add_child wNode01
  wNode00.add_child wNode02
  wNode00.add_child wNode03
  wNode00.add_child wNode04
  wNode01.add_child wNode011
  wNode01.add_child wNode012
  wNode01.add_child wNode013
  wNode012.add_child wNode0121
  wNode012.add_child wNode0122
  wNode012.add_child wNode0123
  wNode0123.add_child wNode01231
  wNode012.add_child wNode0124
  wNode012.add_child wNode0125



  wDB=PStore.new("./test3.db")
  wDB.transaction do |iDB|
    wRowIndex=0
    iDB["node00"]=wNode00
    iDB["node00"].recursive do |iValue, iDepth|
      wText=""
      (0..iDepth).each {|i| wText+=" "}
      puts %Q([#{wRowIndex}]#{wText}#{iValue.value})
      wRowIndex+=1
    end
  end
end



前に戻る