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
前に戻る