カニ本読書メモ 2章:美しいAPIを実装する


コードの共通化する時のコツの学べる本はないか? と、相談した時にお勧めされたので読んでみました

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

本の目的

熟練したRubistたちが当たり前と考えている、プラクティスやイディオムを明らかにすることで
Rubyという言語の根本的な理解を高めること

2章 美しいAPIを設計する

  • メソッドにおける順序付き引数の数は最小限にする
  • メソッドにデフォルト値を持つパラメータが複数あるなら、optionsハッシュによる擬似キーワード引数の利用を検討する
  • 同時に複数の引数処理を扱う必要がある場合、splat(*) 演算子を使う
  • 必須のパラメータがあるなら、それはoptionsハッシュに入れない

2.3 コードブロック

ブロックの使い道

  • each メソッドを実装して、Enumerable を include すれば、組み込みコレクションで使える機能が使えるようになる
  • 後処理/前処理の抽象化
  • 動的コールバック
    • &block を配列とかに保存しておいてコールバックが必要な時に実行したりする
  • instance_evalでインターフェースをシンプルにする
Server.run do
  handle(….)
  handle(….)
  …
end

class Server
  def self.run(&block)
    server = Server.new
    server.instance_eval(&block)
  end
end


yeild と、block.call の戻り値は、与えられたブロックの戻り値とおんなじにしよう!!

2.4 驚かせないこと

  • atter_reader, atter_writer, atter_accesser を使う
    • get_something, set_something より、something, something= を使う
  • メソッドに疑問符をつけた場合、ブール値を返す
  • 感嘆符は破壊的であるというより、注意すべきメソッドという意味で使う
  • カスタム演算子
    • append, add は、<<, + にする
スペースシップ演算子 <=>
  • 現在のオブジェクトと、比較対象が
    • 小さい : -1
    • 同じ : 0
    • 大きい : 1
  • スペースシップ演算子を実装して、Comparableをincludeすると、組み込みの比較メソッドが使えるようになる

まとめ

  • コードをRubyらしくする最善の方法は、できるかぎり基本的なRubyオブジェクトと同じようにすること

感想

  • カスタム演算子とか使ったこと無かった。
    • C++で書いてた時は積極的に使ってたので、使い道がある時があったら使用を検討したい
  • get_something やりがちなので気をつける
  • ブロックはいろんな使い道がある