なんとかフラグというboolean変数名

お約束

レビューでよくあるパターンなのですが...

生年月日フラグがくるぞー

boolean birthdateFlg = false;
for (...)
}

「生年月日フラグ」ということのようですが...

ズバリ、これが true になるのは、どういうとき?

「一つでも生年月日のデータが存在したらtrue」であれば、existsBirthdate, hasBirthdate, birthdateFound とか!?

「それぞれの生年月日が対象日付だったらtrue」であれば、targetBirthdate, isTargetBirthdate, matchedBirthdate とか!?

※この例は、フィクションです。

トリムフラグがくるぞー

boolean trimFlg = false;
for (...)
}

「トリムフラグ」ということのようですが...

ズバリ、これが true になるのは、どういうとき?

「その後の処理でトリムが必要であればtrue」であれば、needsTrim, needsTrimXxx とか!?

「トリムされたデータが存在していればtrue」であれば、existsTrimmed, hasTrimmed とか!?

「それぞれがトリムされたデータであればtrue」であれば、trimmedXxx, isTrimmedXxx とか!?

※この例は、フィクションです。

【追記】checkFlgとかも同じですね。何がチェックされたらtrueになるのか?

わざと省略もありえるが...

まあ、正解はありません。

その変数をsetするプログラム、相当にシンプルで装飾する必要性もないくらい明らかであれば、すごく短くすることはあります。チーム開発じゃなく個人開発であれば、また話も違うかもですし。

でも、それは、そのことをかなり意識して "わざと省略" します。そして、そういう場面はそこまで多くはないと感じます。

booleanは、setする場所と、ifする場所があるので、基本的に二つの場所で利用されるので、何かの処理をまたがる可能性が高いので、setする場所がよくてもifする場所で困ってしまいます。

命名のコツの正解はない

命名の方向性も「こうじゃないきゃダメ」ってのはあんまりありません。あえて言うなら、三単現の動詞 (e.g. has, exists, needs) を使えば、"ニュアンス" と "判定" であることを示しやすいです。また、can, may などの助動詞も使われることもあるかもです。

有名人として is がいるのですが、意味に関係なく「boolean だから is」という使われ方をよくあるので、逆に使いづらい感があります。まあ状態を表すことを強調したいときは使うかな!? (でも、そういう風に解釈されないかもしれないから...)

ニュアンスを知りたい

まあ、そこの形式あれこれの話は置いておいて...

それよりも!

そのboolean, いつtrueになるの?

そのboolean, trueの後でfalseに戻るの?

そういった "ニュアンス" が知りたいのです。ニュアンスを変数名で表現したいところです。ニュアンスを表現していれば、一回きりのtrueなのか?どんどん変化する状態なのか?も自然とわかりやすくなるでしょう。

でなければ、恐らく複雑に込み入っているだろう、booleanがtrueになる部分のプログラムを読まないと、そのbooleanの役割がわかりません。

ニュアンスがあれば、それだけでそこの部分のプログラムの意味を理解できるかも知れませんし、込み入っている部分を読むにしても、当たりが付いているので読みやすくなります。もちろん、多少は文脈や前後関係には頼ることにはなりますが、ニュアンスの入り口となる単語が一つあるだけで大違いです。

Flgが悪いわけではないが

さて、なんとかフラグの Flg ですが、別に悪いわけではありませんが、なんとなく思ったこととしては...

boolean birthdate = false;

さすがに、この変数名はためらうと思います。
でも...

boolean birthdateFlg = false;

ってのは平気で見かけるのです。ためらいがちょっと消えるんじゃないかって。義務を果たした感が出るのかもしれません。

でも、二つの変数名は、情報量が全く同じです。(まあ、あえて言うなら、変数の利用側のプログラムで "判定である" ってことがわかりやすいってくらい!?)

"Flgという三文字を打つ労力" を、
"ニュアンスの単語を打つこと" に、
使った方が良いだろう、という意見です。

boolean existsBirthdateFlg = false;
for (...)
}

まあ、これなら。
でも、もはや Flg なくてもいいですけどね(^^。

DBのカラム名では慣習としてよく使いますが、(jfluteは)プログラム上の変数名ではあまり使うことはないです。ニュアンスを付ける方に注力したいし、ニュアンスの方を目立たせたいからですね。って、気になって調べてみたら、DBFluteソースコード (engine と runtime) では、なさそう(^^。

ってお話でした。

【追記】やはりプログラマーにはデザイン脳が求められますね。
プログラマーに求められるデザイン脳

f:id:jflute:20180930143518j:plain