個人事業主になったので真面目にアウトプットしてみるブログ

フリーで顧客の会社に潜り込んでAndroidアプリつくって、とりあえず食っていけるようにアウトプットを増やしていくブログです。

関数名、メソッド名でgetXXXがダメな理由

ダメである理由

getという単語は、その単語自体がその中で何をしているのかを隠してしまうので、容易に誤解が発生してしまいやすいこと。
・同じオブジェクトからは同じ値が返ってくるという勘違いが発生する恐れがある
・一部のおじさんにはgetter/setterもつ、特異なクラスをイメージさせてしまう
 →別の問題へ派生する可能性が出る:必要もないのにsetを用意しマルチスレッドで扱われるときにその邪悪さの効果を発揮する。すなわち複数で参照され得に参照するスレッドが異なっているときに、setを使ってしまう事で、別のスレッド側ではたまに起きる(たまたまタイミングが一致したときだけ)のような、発見が難しいバグとなって現れる。

よく言われる代替案

・単純な参照ではない場合
 →load/fetch/find/request/など実際の処理がイメージしやすい命名を選ぶ
・単純な参照の場合
 →System.currentTimeInMillis()のように直接参照しているようなイメージになるようにする
 or→finalかつ非privateな値として宣言しgetterをはさまず直接参照する

getしか使いようがないが、getをそのまま使うと誤解が発生するケースの代替案
・言葉としてgetしか使いようがない場合、オンメモリ上の参照でNullが発生する可能性がある場合
 →getXXXOrNull()
・言葉としてgetしか使いようがない場合、対象の存在がオンメモリ上ではなく外部に依存していて、Nullがあり得る場合
 →getXXXIfExist()


まとめ

絶対に使わないとするとすごく難しい問題が出てくる。しかしできるだけ防ぎたい問題である。