2014/02/21

if ( 状態変更関数() ) ←これ止めて

関数の戻り値は実行の成否のbool値。まぁいつもいつも細かいことを愚痴々、、と思うかも知れない。でもJavaではifの条件文でオブジェクトの状態が変わるような書き方は初歩的な非推奨の書き方のはずだ。そんなにジャバジャバ言うならCの世界に入ってくんなと言われそうだが嫌なものは嫌だ。

if(isEmpty()) // OK
is〇〇()という名前の関数はオブジェクトの状態、内容で真偽値を返すが、その実行によってオブジェクトの状態や内容は決して変わらない。

BookTitle myTitle = myBook.getTitle();
if(myTitle == null) // OK
getter関数も決してオブジェクトの内容を変えてはいけない。
だからと言ってgetter呼び出し、ローカル変数に設定、nullチェック、までをifの条件式の中でやるような人は居ないだろう(居ても関わっちゃいけない)。
ちなみに便利さとのトレードオフでwhile文の条件式ではたまにやるかもしれない。
while((line = br.readLine()) != null)
というのがよく見る例だ。でもこれはfor文で
for(String line = br.readLine(); line != null; line = br.readLine())
って書いた方が良いんじゃないかな。

bool ret = myBook.changeTitle("Happy Java Life -第2版-");
if(!ret) // OK
そしてこれが状態を変化させる関数の成否を判定する場合。setterは大抵voidだと思うのでchangeTitleという例にした。タイトル変更に成功したらtrue、失敗したらfalseが返り、その成否を判定する例。インデントに頼ってコードをザッと追いかけるときに異常系のチェックは読み飛ばしがちだが、このコーディングなら問題無い。

if(myBook.changeTitle("mogomogo -第2版-")) 
// NO! ABSOLUTELY NO!!! WHAT THE FUCKING WRITING!!?? GAAAA!!! DIE REBEL!!!!

(追記)
怒りは理解力の足を引っ張ります。
怒りが理解力を妨げることは科学的に証明されています。
コードを追っている時に心穏やかでいることは、速やかな理解に役立つに違いありません。
残念なことに我々はしばしばF〇CKなどと口走り、時に罵るようなコメントを書き込みながら他人のコードを眺めています。

既存のコード、リリース審査を通り抜け、動作実績のあるコードを仏の心で受け入れましょう。


ちなみに「怒りが理解力を妨げることは科学的に証明されている」という元ネタのレポートは見つかりません。いかにも本当に聞こえる嘘かも知れません。でも怒ってはいけません。

0 件のコメント:

コメントを投稿