refactoring
shuzo-kino.hateblo.jp でC言語のTDDという奴を試しました。 ArduinoはC++の方言なので、厳密には適用できないケースは結構あります。 最近は状況が大分マシになったようで、いくつか案がでています。 arduinounit 専用テスト環境arduinounit! 公式配布では…
たとえば、次のようなコードがあったとします。 result = data.inject([]) {|a,c| ((c.x) > 10) ? a << c.y : a } ブロックの中がグチャグチャしてますね。 こういう時は、素直に result2 = data.select {|e| e.x > 10}.map(&:y) その上、この形式ならlazyを…
Structクラスを継承してはいけない(戒め - Bye Bye Mooreshuzo-kino.hateblo.jp でシレッと書きましたが、Structにはメソッドを与える事ができます。これを使うと、 「そのクラス内でしか使わないけど、色々値の扱いが入り組んで面倒なデータ構造」を調子よ…
たとえば、次のようなタイプと値を指定すると特定の処理をしてくれるメソッドがあったとします。 def sortMethod(type,val) case type when :name then val.upcase when :val then val.next end end sortMethod(:name, "name") #>> "NAME" sortMethod(:val, …
次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。 class Hoge def set_unit_price(val, power, speed, mp) special_param = power * speed * val magic_param = mp * speed * 13 if val > 10 unit_price = special_para…
個人的によくやりがちな実装法なのでメモ。メソッドにパラメータを渡し、case文やif-else文で実行コードを分岐させるような実装は、 以下のよな手順でリファクタリングできます。 例 class TestClass def self.create_member(type) case type when :admin Ad…
似た内容の違う名前なメソッドを定義するケース、結構ありますよね。 こんな時は動的定義が生きてきます。キモは、次のdef_eachメソッドです。 instance_execとブロックを使って格好よく処理します class Class def def_each(*method_names, &block) method_…