Refactoring2-5
moduleを使ってSVG描画部分を分離
さてようやくクラスの作成.とその前にrubyにあるmoduleを使う.単なる関数をまとめておく容器と思えばいい.SVGの描画のみを扱っている関数群を取り出して,module SVGにまとめる.まさに"Chunking"よ!
まずはmoduleを作って移していく.refactoringのポリシーに従うなら一個ずつ動作確認しながら動かして!! 慣れてきたら,query-replaceでいっぺんにしちゃってもいい.
どっかで見落としたみたいなんやけど,polylineも変更してます. >|ruby| svg0.rb module SVG
def self.polyline(points,fill,stroke,stroke_width)
%Q{<polyline fill="#{fill}" stroke="#{stroke}" stroke-width="#{stroke_width}"
points = "#{points.join(' ')}" />}
end
def self.line(x1,y1,x2,y2,stroke,stroke_width)
%Q{<line x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"
stroke="#{stroke}" stroke-width="#{stroke_width}" />}
end
def self.rect(cx,cy,width,height,fill,stroke,stroke_width)
%Q{<rect x="#{cx-2}" y="#{cy-2}"
width="#{width}" height="#{height}"
fill="#{fill}" stroke="#{stroke}" stroke-width="#{stroke_width}" />}
end
def self.text(cx,cy,msg,font_family,font_size,fill)
%Q{<text x="#{cx}" y="#{cy}"
font-family="#{font_family}" font-size="#{font_size}"
fill="#{fill}" >#{msg}</text>}
end
end
| < |
さらにファイルも別にして維持がしやすいようにする. >|ruby| refact後 require 'svg0.rb' NUMBER_OF_TOSSES = 20
def toss
2 * (rand(2)*2 - 1)
end
def values(n)
a = [0]
n.times { a << (toss + a[-1]) }
a
end
SQ=4 SPARK_COLOR='red' def spark(cx, cy, value)
%Q{#{SVG.rect(cx-SQ/2,cy-SQ/2,SQ,SQ,'red','none',0)}
#{SVG.text(cx+6, cy+4, value,"Verdana","9",SPARK_COLOR)}}
end
$tosses = values(NUMBER_OF_TOSSES) points = [] $tosses.each_index { |i| points << "#{i},#{200-$tosses[i]}" }
data = %Q{<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" > <!-- x-axis -->
#{SVG.line(0,200,NUMBER_OF_TOSSES,200,"#999","1")}
#{SVG.polyline(points,"none","#333","1")}
#{spark(NUMBER_OF_TOSSES-1, 200-$tosses[-1], $tosses[-1])}
</svg>}
puts data
| < |
ここまで整理されてくると,何をやっているかがすぐに理解できるようになる. しかし,それだけでなく...
Keyword(s):
References:[Refactoring2] [RubyPrimary]