C#でフラグ扱いの変数名にフラグと命名してはいけない

若干、揚げ足取りなのかもしれませんが、このような記事がQiitaに上がっていた上がっていました。

qiita.com

で、フラグ的なbool型の変数にフラグって名前を付けちゃうと脳に負担がかかるからやめようという話です。記事では評価方法の話題ですがここでは変数の命名に関して考察しようと思います。

取り合えず、リンク先のようにbool型なフラグ的な変数の変数名に「なんちゃらフラグ」って名前を付けた時点で、 ↓ のように書いてもしょうがないのかなぁ・・・なんて思っています。

if(this.ikaFlag == true)
{
   // ikaFlagがtrueの時の処理
}

if(this.takoFlag == false)
{
   // takoFlagがfalseの時の処理
}

なぜかというと、読む側はこのコードを読むとき「もし、なんちゃらフラグがtrueだったら、、、」と読んでると思うんですよね。(まぁ無意識で処理されてここまで心の声は出ないとは思いますが)

これが「if (xxxFlag)」だと、心の声で「もし、なんちゃらフラグだったら」となり、意味不明です。フラグです。はい。基本、変数名に意味が薄いです。が、経験から「あ、これはbool型の変数だから省略されたらtrueだったらに読み替えるんだよね」と処理され結局「もしなんちゃらフラグがtrueだったら」となっている気がします。

そして、この読み替えが度々(ひどいと数百回単位で)出てくる都度、脳が毎回このような補完をしていると微妙に疲れる気がするんですよね。(あくまで個人の感想ですが)しかもなんちゃらフラグがtrueの時の意味はXXXで、falseの時はYYYって意味が2重に定義されているというか・・・

否定文の場合

これ、フラグの否定文の場合もっとひどく「if (!xxxFlag)」だと「もしなんちゃらフラグじゃない場合」って「いや、フラグだろ…」ってなります。(なりませんか?)ただ、この時もも心の中で「あ、これはbool型(ry」から、「もしなんちゃらフラグがfalseだったら」としている気がします。

複合文になるともっと変になる

良くあると思うですが、「if (xxxFlag && !yyyFlag || cccFlag)」は「もしなんちゃらフラグかつ、ほんちゃらフラグでない、またはほにゃららフラグ場合」って結局「フラグであってフラグでない、またはフラグの場合」みたいな一休さんタイプになってしまいます。こうなると無意識で処理できないので意識に上げて読みほぐす事になりますが、これを考えるのは結構きついです。

bool型の変数の名前の付け方

何が言いたいか纏まっていませんが、「bool型の変数名は状態を識別できる名前を付けましょう」が近いと思います。例えば、この変数が「Disabled」なら「if (Disabled)」で「もし無効なら」って読んだとしても特に無理なく処理できるかなぁ?

コードにするとこんな感じです。

if(this.SwitchDisabled)
{
    // Switchが無効の場合の処理
}

if(!this.TcpConnecting)
{
    // TCPが接続中でない場合の処理
}

何のためのフラグなのかもう一歩踏み込んだ命名をすることで心の声とうまく折り合いがつく気がします。そして、どうしても自然な読み方ができない「なんちゃらフラグ」はオブジェクトに閉じて操作で意図を表した方が自然なのかなと。

いまいち、言いたいことが纏まりませんでしたが以上です。