kairo-gokko (19) Circuitクラスを改めて追加 / リファクタリングなど



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 の修正

  • 同時に複数の効果音が再生できるようにした
  • 効果音を再生時にロードするのをやめ、最初にまとめてロードするようにした

これはリファクタリングではありません。 どちらも切実に困っていたわけではないですが、直し方が分かったので直した、思いついたので直した、という感じの修正です。