kairo-gokko (6) Circuit, View



PlusPole, MinusPole

放置していた電池のプラス極・マイナス極をいい感じのオブジェクトにしておきます。

  • Unit::PlusPole
  • Unit::MinusPole

これまでは LiboDraw::Rectangle のオブジェクトをそのまま使って矩形を描画していましたが、 一度プラス極・マイナス極を担当するオブジェクトに変換して描画に使うようにします。

マイナス、プラスの記号も表示するようにしました。 一部線が重なっていますが、これは後で直します。

f:id:sonota88:20200223085504p:plain

Circuit

viewer.rb がだいぶ膨らんできたので整理します。 今の時点で 300 行弱あります。

circuit.rb を新規作成して下記のメソッドを Circuit クラスにごっそり移動。 純粋関数っぽいメソッドはリファクタリングが楽でいいですね。

to_plus_pole
to_minus_pole
to_wire_fragments
make_degree_map
select_start_points
make_pt_wfs_map
select_next_wfs
take_edge
to_edges

それから、 ファクトリメソッド Circuit.create() を作り、 edges など回路に属するパーツを作成する処理をそこに移動。

View

描画部分も野暮ったい感じなので View というクラスを作ってそっちに移動させます。 雰囲気としては MVC の V っぽいイメージです。

これにより Drawer が View 内に隠蔽され、メインのロジック(viewer.rb)から見えなくなりました。


viewer.rb がすっきりしました。 メインの部分がこんな感じになり、見通しが良くなったと思います。

doc = LiboDraw::Document.new(path)
page = doc.pages[page_no - 1]

circuit = Circuit.create(
  page.lines,
  page.rectangles
)

view = View.new(PPC)

view.draw_grid(8, 10)

circuit.plus_poles.each { |pole|
  view.draw_plus_pole(pole)
}

circuit.minus_poles.each { |pole|
  view.draw_minus_pole(pole)
}

circuit.edges.each { |edge|
  view.draw_edge(edge)
}