アクセスメソッド(アクセサメソッド )について(Ruby)

f:id:ryoutaku_jo:20190801092203p:plain

【結論】

・アクセスメソッド(アクセサメソッド )とは、インスタンス変数の値を、クラス外からでも参照したり書き換え出来るようにするメソッド

Rubyの場合、attr_reader/attr_writer/attr_accessorというメソッドで簡単に定義することが出来る

・定義後は「オブジェクト名.インスタンス変数名」という記述で、値の参照/更新が可能になる

【目次】

【本題】

アクセスメソッド(アクセサメソッド )について

アクセスメソッド(アクセサメソッド )とは、インスタンス変数の値を、クラス外からでも参照したり書き換え出来るようにするメソッドです。

通常、クラスの中で使われているインスタンス変数はクラスの外からは参照したり値を変更したりすることが出来ません。

class Pokemon
  def initialize(name)
    @name = name
  end
end

pokemon = Pokemon.new('ピカチュウ')

#クラス外部では値が参照出来ない
puts @name
=> nil

値を参照/更新したい場合もインスタンスメソッド経由して行う必要があります。

class Pokemon
  def initialize(name)
    @name = name
  end

  def getName
    @name
  end

  def setName=(changed_name)
    @name = changed_name
  end
end

#クラス外部から値の参照が可能
pokemon = Pokemon.new('ピカチュウ')
puts pokemon.getName
=> ピカチュウ

#クラス外部から値の更新が可能
pokemon.setName = 'ギエピー'
puts pokemon.getName
=> ギエピー

このクラス外部から値を参照/更新する為のインスタンスメソッドが、アクセスメソッド(アクセサメソッド )です。

Rubyでのアクセスメソッドの実装方法

なお、Rubyには、このアクセスメソッドを簡単に実装する方法があります。

それが、attr_reader/attr_writer/attr_accessorというメソッドです。

これらで定義した場合、「オブジェクト名.インスタンス変数名」という記述で、値の参照/更新が可能になります。

attr_readerは読込専用のアクセスメソッドで、先ほどのサンプルコードのgetNameにあたるインスタンスメソッドを自動で定義してくれます。

attr_reader(インスタンス変数名1, インスタンス変数名2, ...)
class Pokemon
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

pokemon = Pokemon.new('ピカチュウ')

puts pokemon.name
=> ピカチュウ

attr_writerは書込専用のアクセスメソッドで、先ほどのサンプルコードのsetNameにあたるインスタンスメソッドを自動で定義してくれます。

attr_writer(インスタンス変数名1, インスタンス変数名2, ...)
class Pokemon
  attr_reader :name
  attr_writer :name

  def initialize(name)
    @name = name
  end
end

pokemon = Pokemon.new('ピカチュウ')
puts pokemon.name
=> ピカチュウ

pokemon.name = 'ギエピー'
puts pokemon.name
=> ギエピー

attr_accessorは読み書き両方に対応しており、getNamesetNameにあたるインスタンスメソッド両方を自動で定義してくれます。

attr_accessor(インスタンス変数名1, インスタンス変数名2, ...)
class Pokemon
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

pokemon = Pokemon.new('ピカチュウ')
puts pokemon.name
=> ピカチュウ

pokemon.name = 'ギエピー'
puts pokemon.name
=> ギエピー

このように個別でメソッドを定義するより、簡単にアクセスメソッドを提供してくれます。

参考情報

attr_reader (Module) - Rubyリファレンス

attr_writer (Module) - Rubyリファレンス

attr_accessor (Module) - Rubyリファレンス

《今日の学習進捗(3年以内に10000時間に向けて)》

現在開発中のサービスのシステム的な観点での品質向上の為、CTOが定期的にフォローしていただきながら、既存機能のリファクタリングなどを行う事になった。 チーム内で最適解が見出せないまま、リリースした機能も少ないので、非常に心強い。

それに伴い、チーム全体のタスクを「開発・運用・改善」の3つにカテゴリ分けし、それぞれに割く工数をあらかじめ決めておくことで、リファクタリングに割く工数を確保することになった。 一旦チーム内では、「開発:運用:改善」=「5:3:2」という話になった。

開発が全体の半分と少ない印象を受けると、逆に本来最小限に抑えるべき運用が3割とやや多めに感じるが、今後導入企業が増える中で新たな問題が発生することが想定されるので、運用にある程度バッファは持たせておくべきだと考えている。

また、現状チーム全体でどのタスクにどれほど稼働が割かれているのかが感覚値でしか把握できない状況だが、この運用を開始するのであれば、振り返りを行うためにも、一日の中でどのタスクにどれだけ稼働を割いていたのかを、ざっくりとでも良いと思うので、記録を取った方が良いと考えている(日付・タスク・カテゴリ・担当者・所要時間(h))

学習開始からの期間 :237日
今日までの合計時間:2275h
一日あたりの平均学習時間:9.6h
今日までに到達すべき目標時間:2164h
目標との解離:111h
「10,000時間」まで、

残り・・・「7725時間!」