2016年03月

2016年4月発売の気になる技術書

2016-04-09発売


2016-04-12発売

改訂第3版 すらすらと手が動くようになる SQL書き方ドリル (WEB+DB PRESS plus)
羽生 章洋 和田 省二 菅井 大輔
技術評論社
売り上げランキング: 25,104

2016-04-15発売


2016-04-16発売

初めてのAnsible
初めてのAnsible
posted with amazlet at 16.04.16
Lorin Hochstein
オライリージャパン
売り上げランキング: 1,614

2016-04-28発売

Unix考古学 Truth of the Legend
藤田 昭人
KADOKAWA (2016-04-28)
売り上げランキング: 42,186

リファクタリングどこまでやるの

僕はプログラミングの際、設計についてはあまり考えず、必要な機能を満たすコードをガーッと書いて、あとでザクザクとリファクタリングすることが多い。クラス数が元の何倍になることもある。

とはいえ、完璧主義の僕にとってリファクタリングは、いくらやっても終わらないハマりポイントになりがちだ。なので、コードからなんとなく漂う違和感がなくなった段階で、思いきって終わりにするしかない。


下記は、リファクタリング途中のコードを模式化したものです。さて、僕はどこまでリファクタリングしたでしょうか。

class PetOwner
  def initialize(pet)
    @pet = pet
  end

  def work
    case @pet.type
    when 'dog'
      self.buy_dog_food
    when 'rabbit'
      self.tidy_up_room
    when 'bird'
      self.close_window
    end
  end

  ...
end

答は後日。細かい点は気にせず、インスタンス変数のプロパティに応じて異なるメソッドを呼んでいる構造にのみ注目してください。


追記(2016-03-15)

こんな感じにした。

class PetOwner
  def initialize(pet)
    @pet = pet
  end

  def work
    self.fulfill(@pet.owners_duty)
  end

  ...
end

class Pet
  def initialize(type)
    @type = type
  end

  def owners_duty
    case @type
    when 'dog'
      BuyingDogFood.new
    when 'rabbit'
      TidyingUpRoom.new
    when 'bird'
      ClosingWindow.new
    end
  end
end
  • case文をPetクラスに移動した。typeによる分岐はPetクラスの責務だと思ったので。
  • PetOwnerクラスのインスタンスをPetクラスのメソッド引数で渡すのは避けた(なんとなく)。

これでよかったのかどうか、今はまだ分からない。とりあえず寝よう。

コードを工夫するよりも

以前「テストを工夫するよりも」という記事で、テスタビリティを重視した設計が好みである旨を書いた。だが、最近は考えが変わりつつある。

「現在時刻に応じて挨拶する」メソッドにおいては、Rubyでいえば「Time.now」で現在時刻を取得するのが、もっとも自然で読みやすい形だろう。テスタビリティを重視して、引数なりインスタンス変数なりを増やしていくと、コードがどんどん複雑になり、理解しづらくなってしまう。

そもそも、Rubyの場合「Time.now」のままでも簡単にテストできる。「時刻ライブラリに介入」できるからだ。そういう言語なら、テストのためだけに(ですよね)コードを変形する必要はないんじゃないですかねえ。

プロフィール

ENECHANGE株式会社VPoT兼CTO室マネージャー。AWS Community Builder (Cloud Operations)。前職はAWS Japan技術サポート。社内外を問わず開発者体験の向上に取り組んでいます

カテゴリ別アーカイブ
月別アーカイブ
ブログ内検索