LoginSignup
0
0

More than 3 years have passed since last update.

ゲッターとセッターをの理解をごっちゃにしないために【なんでもかんでもアクセサを使わない!】

Posted at

ゲッターとセッターの解説記事は何個かあるので、そこはお任せするとして、
あと、アクセサという便利なコードもありますが、使い分けについて書かれてる物がすくなかったので、初学者編の基礎として振り返ろうと思って書きました。

まずはよくある車を設計する所です。

アクセサを使える場合

車の設計
class Car
  attr_accessor :model, :color, :option
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=> すべて変更可能

これだったら、attr_accessor でまとめてしまっても良いのですが、
例えば 「もう車作ってるのに、車種と色変えられたら困るよ!!!(オプションだけだったらいいけど・・・)」 という場合の書き方は、

ゲッターとセッターを使う場合

車の設計
class Car
  attr_reader :model, :color, :option
  attr_writer :option 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=>オプションだけ変更可能

っていう書き方が普通になりますけど、
アクセサを使って更にスマートに書くのであれば、

アクセサとゲッターを使うのがスマート

車の設計
class Car
  attr_accessor :option
  attr_reader :model, :color 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=>オプションだけ変更可能

になります。

ちなみに、

車の車種を変更しようとすると・・・

車の設計
class Car
  attr_accessor :option
  attr_reader :model, :color 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

car.model = "BMW"
#=>NoMethodError (undefined method `model=' for #<Car:0x00007fc009900440>)

という風に怒られます!!「車種変えるんじゃねぇよ!もう作ってるんだよ!」という事ですね。色を変えようとしても同じようなエラーになります。

まとめ

という事で、Ruby初学者が勉強するゲッター、セッター、アクセサの使い分けについて振り返っていきました。
初学者の方の参考になれば幸いです。ありがとうございました!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0