これまたフィヨルドブートキャンプで何度も説明しているのでまとめておきます。
getterとsetter
一般的なGetterとSetterについてはこちら:
3.5 GetterとSetter : Javaのオブジェクト指向入門
title
というメンバ変数があった場合、getter, setterを実現するためにget_title
set_title
というメソッドを作らなきゃいけないのは冗長。
rubyではアクセサというが、メンバ変数と同名のメソッドができる機能がある。
attr_accessor :title
c#やswiftなどでもプロパティという仕組みで同様のことができる。
public string Title { get; set;}
クラス名、メンバ変数名、メソッド名の原則
- クラス名:名詞
- メンバ変数名:名詞
- メソッド名:動詞
変数の動詞化
見方を変えると、title
にget_title
というメソッドをあてがうというのは変数をメソッド化(=動詞化)するために無理やりget
を付けていることになる。
メンバ変数のように振る舞うメソッド
rubyではメソッドを呼び出すとき必ずしも()を付ける必要がない。
foo() # カッコあり
foo # カッコなし
これにより、本来動詞であるべきメソッドを名詞にして、カッコなしで呼び出すとメンバ変数であるかのようにみえる。
article = Article.new
article.title # メンバ変数が呼べているように見える
rubyはこれを利用してアクセサを実現している。(c#やswiftでは専用の構文を用意している)
attr_accessor :title
def title
@title
end
def title=(title)
@title = title
end
↑この2つは同じ。
アクセサの考えを自分のプログラムに活用する
これは自分のプログラムにも活用できる。
メソッド名が名詞であって、そういうメンバ変数のアクセサとして動いているように”見えれば”問題ないメソッドになる。
def age
today - birthday
end
user = User.new
user.age # そういうメンバ変数にみえる
実際にはそんなメンバ変数はなく、メソッドがメンバ変数のフリをしているだけだ。クラスを使う人からみれば同じように振る舞うのであれば問題ない。
複雑な処理を整理したいとき、これを使ってなるべくそのクラスのメンバ変数に見える名詞メソッドの形にしてみよう。
たくさんのメンバ変数(に見える名詞メソッド)を扱う少数のメソッドという形になると全体が把握しやすくなる。
何故ならメンバ変数よりメソッドの方が入力・出力・副作用を考えなければ行けないので複雑だから。
メソッド名の原則を外れていてるコードを見たとき
他人のrubyコードを見たとき「メソッドなのに動詞じゃない」と思ったときはこのテクニックが使われてないか考えてみよう。そして自分のコードにも取り入れるとわかりやすいコードになるかもしれない。