test/helper を追加
テストのファイルが 2つに増えたので、共通部分を helper にまとめておきます。
# test/helper.rb require "minitest/autorun" $LOAD_PATH.unshift File.expand_path("..", __dir__)
各テストファイルの require 部分がこうなりました。
# test/test_tuden.rb require_relative "./helper" require "tuden"
Circuit クラスを追加
回路全体を表し、子回路をたばねて統括するクラスです。 CircuitManager みたいな名前にしたくなるやつですね。
子回路(の配列)を生成する処理をファクトリーメソッド ChildCircuit.create
で行っていましたが、
子回路は他の子回路について知らなくてよいはずです。
そこで、回路全体を生成する責務は Circuit クラスに負わせることにします。
ファクトリーメソッド Circuit.create
を用意し、
ChildCircuit.create
で行っていた内容をほぼそのまま移動。
# class Circuit def self.create(lines, rects) all_plus_poles = ... all_minus_poles = ... all_switches = ... wf_set = to_wire_fragments(lines) all_edges = to_edges(wf_set) edge_groups = to_edge_groups(all_edges) child_circuits = edge_groups.map { |edges| plus_poles = select_child_circuit_units(edges, all_plus_poles) minus_poles = select_child_circuit_units(edges, all_minus_poles) switches = select_child_circuit_units(edges, all_switches) ChildCircuit.new( edges, plus_poles, minus_poles, switches ) } Circuit.new(child_circuits) end
それにともない、関連するメソッドとクラスをごっそり Circuit クラスに移動させました。
- to_plus_pole - to_minus_pole - to_switch - to_wire_fragments - make_degree_map - select_start_points - make_pt_wfs_map - select_next_wfs - take_edge - to_edges - EdgeCluster - to_edge_groups - select_child_circuit_units
ChildCircuit には何が残ったかというと、 ほとんど通電判定関連のメソッドですね。 通電判定は子回路ごとの関心事なので、ChildCircuit に置いたままにした方が適切でしょう。
main.rb
のトップレベルに置いていたこういうメソッドも Circuit クラスに移動。
def find_switch_by_position(pos) @child_circuits.each { |child_circuit| pushed_switch = child_circuit.switches .find { |switch| switch.pos == pos } return pushed_switch if pushed_switch } end
dxopal_sdl.rb の修正
- 同時に複数の効果音が再生できるようにした
- 効果音を再生時にロードするのをやめ、最初にまとめてロードするようにした
これはリファクタリングではありません。 どちらも切実に困っていたわけではないですが、直し方が分かったので直した、思いついたので直した、という感じの修正です。