プログラミングスクールのフィヨルドブートキャンプの提出物のレビューでよく指摘するシリーズ。
rubyではメソッド呼び出しにカッコ()が必須ではありません。カッコを使わずにメソッドを呼び出すと単に変数を参照しているように見えます。
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 # そういうメンバ変数にみえる
実際にはそんなメンバ変数はなく、メソッドがメンバ変数のフリをしているだけだ。クラスを使う人からみれば同じように振る舞うのであれば問題ない。 複雑な処理を整理したいとき、これを使ってなるべくそのクラスのメンバ変数に見える名詞メソッドの形にしてみよう。 たくさんのメンバ変数(に見える名詞メソッド)を扱う少数のメソッドという形になると全体が把握しやすくなる。何故ならメンバ変数よりメソッドの方が入力・出力・副作用を考えなければ行けないので複雑だから。
注意
ただ、メンバ変数のように見えるメソッドが派手な副作用を持っている時、使う人から見るとエゲツない罠となる。