jfluteの日記 このページをアンテナに追加

2015-10-20

単純な話、getであんまり検索したくない

|

getという名前のついたメソッドで、
検索処理を書いているのをよく見かけます。

昔からできるだけ直してもらうように
提案してきました。
強いこだわりがあればしょうがないですが...

 o 単純に思いつかなかったから
 o 別段深く考えずにメソッド名を付けていただけ

とかであれば、ちょっと違う名前にして欲しいなと。

get...は軽いイメージ

少なくとも Java で get...() というと、
特別なイメージが刷り込まれているもので、

内部で持っているインスタンス変数を
ただ戻すだけのメソッド

というイメージあります。
厳密にそうでないにしても...

少なくとも処理としては軽いイメージ

でも、それで検索しちゃっていると...
for (SeaBean bean : beanList) {
    ...いろいろな処理
    Integer memberId = bean.getMemberId();
    Member member = logic.getMember(memberId);
    String memberName = member.getMemberName();
    ...いろいろな処理
}
他の普通の get...() と紛れて、
ぱっと見でループ内検索していることが
ちょっと気付きづらいんですよね。
いわゆる「ぐるぐる系」です。
それを発見しづらくなるという話です。

じっくり読めばそりゃわかりますが、
みんなでやるレビュー会とかって、
そんなじっくり読めなかったりします。
(他のテーマで時間たくさん取るから)

もし、パッと見で気付ければ、
「それ直しておいて」ですぐに終了。
個人レビューでも、見るものはたくさんあるので、
サラッと追うだけで気付けるコードってのは、
すごく心強いのです。

それができずに放置されると...
後々パフォーマンス劣化トラブルとして、
ボディブローのように効いてくるのです。

重いイメージなら気付きやすい

もし、こうだったら?
for (Integer memberId : memberIdList) {
    ...いろいろな処理
    Integer memberId = bean.getMemberId();
    Member member = logic.selectMember(memberId);
    String memberName = member.getMemberName();
    ...いろいろな処理
}
レビューの時とか、パッと見で
「おおっと、なんかおかしいよ!?」
ってのがすごく気付きやすい。

別に select でも search でもなんでもいいですが、
そこで...

通信して別のサーバーハードディスクにアクセスしている

というのが直感的に分かれば。

たぶん、書いてる人も書いた後で
「いやぁ、これはないなぁ」
とか、自分で気付いてリファクタリングする
きっかけになりやすいかなと。

仮に、スタートアップの開発で実装スピード優先のため、
ぐるぐる検索はいったん置いておくと判断をしたとしても、
後でリファクタリングする人がすぐに発見しやすいように
なっていればとまだ救い。
(まあ、そもそもtodoコメント残しておいて欲しい)

コードの解析ツールとかでも、
発見しやすいかもしれませんしね。

もちろん、全部じゃないよ

もちろん、
 o DBにアクセスしているのか?
 o キャッシュから取っているのか?
 o はたまた別のところから取っているのか?
それをわざと隠蔽したいとかであれば別ですよ。
狙って LazyLoad するとかね。
要は、getってわりとボカした名前なわけです。

ただ、そういう場面はそんなに多くはない。
あと、アーキテクチャ次第でもありますね。

名前を直すのは簡単

今の時代、IDEリファクタリング機能があるので、
メソッド名を直すのは簡単です。

Eclipseであれば、
"alt + command + R" でホイ

リーダブルコードにも書いてあった

リーダブルコードにも、
「ユーザの期待に合わせる」
という欄に書いてありました。

おそらく、他の言語でも同じでしょうかね。

レビューしてもらいやすいコード

ぼくはよく、

レビューしてもらいやすいコード

を書こうね、
と若いプログラマーに教えています。

一発で正確に動くコードを書けるようになる、
ってのは当然みんな頑張ることではありますが、
なかなか限度もあります。
成長段階の若者であればなおさら。

なので、仮に間違ってたとしても、
レビューしやすいコードだったら、
誰か別の人が間違いに気付いてくれるかも。
プルリクでコメントもらってそれで直るんなら、
業務としては万々歳なわけです。

メソッド名で意図を表現するというのは、
レビューで間違いを見つけてもらいやすくする
テクニックの中の一つ

なんじゃないかなって思ってます。
トラックバック - http://d.hatena.ne.jp/jflute/20151020/stopgetselect