Rubyとは違い,Scalaはメソッドが括弧を伴って宣言されているかどうか(引数が無いメソッドにのみ該当します)に意味を持たせています。例えば,
def foo1() = ...
def foo2 = ...
これらはコンパイル時に事なるメソッドとして解釈されます。foo1は括弧があろうと無かろうと呼び出す事ができますが,foo2は括弧ありでは呼び出す事ができません。
従って,メソッド宣言をいつ括弧ありでするべきか,またいつ括弧無しでするべきかについてのガイドラインに従う事が非常に重要です。
アクセッサ(フィールドでも,論理プロパティでも)として働くメソッドは,副作用がある場合を除いて括弧なしで宣言するべきです。RubyとLiftは!を使って副作用があることを示しますが,括弧の使用の方が好ましいです[1]。
さらには,呼び出し側は宣言に従うべきです。つまり,括弧付きで定義されていれば括弧付きで呼び出すということです。わずかな文字数であっても節約したくなる誘惑にかられるかもしれませんが,このガイドラインに従えばコードはとても読みやすく,メンテナンスしやすくなります。
// 状態は変えません。birthdateの形で呼びます。
def birthdate = firstName
// 内部状態を更新します。age()の形で呼びます。
def age() = {
_age = updateAge(birthdate)
_age
}
脚注
[1] | 流れるようなAPIと内部DSLには,構文のため以下で提供するガイドラインを破る傾向があります。このような例外は規約違反として考えるべきではありません。DSLでは,構文が最も重要であり,規約に優先します。 |