Effective Rubyを読んでいます(1)

tl;dr

「Effective Ruby」の項目14から項目16まで読みました。 :arrow_down: 目次です。

  • 項目14 protectedメソッドを使ってプライベートな状態を共有しよう
  • 項目15 クラス変数よりもクラスインスタンス変数を使うようにしよう
  • 項目16 コレクションを書き換える前に引数として渡すコレクションのコピーを作っておこう

新しく知ったこと

protectedとは(項目14)

protectedは、同一クラスのオブジェクト間か、スーパークラスが同じクラスの場合に使用出来ます。 目的としては、プライベートな状態を外部と共有したくないが、近しいオブジェクトとは共有したい場合に使います。

protectedメソッドを使用した場合と使用しない場合を、Pointクラスのline_symmetry?メソッドを例にそれぞれ実装してみようと思います。

protectedメソッドを使用する場合

class Point
  def initialize(x, y)
    @x = x
    @y = y
  end

  def line_symmetry?(other)
    # other.coordinateを読み出し処理を行う
  end

  protected

  def coordinate
    [@x, @y]
  end
end

protectedメソッドを使用しない場合

class Point
  attr_reader :x, :y

  def initialize(x, y)
    @x = x
    @y = y
  end

  def line_symmetry?(other)
    # other.xやother.yを呼び出し処理を行う
  end
end

まとめ

protectedメソッドを使用する場合、xとyを外部に公開せずに済みました。一方、protectedメソッドを使用しない場合、xとyを外部に公開せざるを得ませんでした。