読者です 読者をやめる 読者になる 読者になる

おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

広い視野を持ってアルゴリズムを決めるべき

rails

今日どうしようか悩んだところをメモ。

背景

nameとcount属性を持つモデルHogeがあるとして、nameが存在していればcountを1増やし、nameがなければ新しく作ってsaveするメソッドincreaseを作るとする。この時に、Hogeの初期のcountを1にするか0にするかでアルゴリズムが少し変わる。

アルゴリズム

初期値1の場合
class Hoge
  def self.increase(name)
    hoge = find_by_name(name)
    if hoge
      hoge.count += 1
    else
      hoge = Hoge.new(:name => name)
    end
    hoge.save
  end
end
初期値0の場合
class Hoge
  def self.increase(name)
    hoge = find_by_name(name) || new(:name => name)
    hoge.count += 1
    hoge.save
  end
end

感想

初期値0の方がアルゴリズム的にスマートだなーと思って最初はそうしていたけど、汎用性がない(別のメソッドHogeを作るときに、初期値0であることを忘れそう)ので結局初期値1に変更した。目先のアルゴリズムの美しさにとらわれたらいかんね。