rn.log

備忘録など

【プログラミング】bool変数の代入について考察

今回の記事はプログラミングについての話題になります。

言語はC#あたりを想定しています。

2つのコード

まずは以下の2つのコードを見てください。

// コードA
b = a; // bool値を直接代入している
// コードB
if (a) 
{ 
   b = true; // bool値の書き換え
} 
else 
{
   b = false; // bool値の書き換え
}


どちらのコードも、やっていることは

a が true なら b をtrue にする
a が false なら b もfalseにする

非常にシンプルなコードです。

使い分け

個人的な好みになりますが、

変数をコピーするだけ」という意図を強調したい場合はコードA
条件にひもづいた処理を追加する可能性が高い」ことを強調したい場合はコードB

という使い分けを意識しています。

良いコードはどちらか

さて、このコードAとコードBですが、実際のところどちらが良い書き方なのか、少し気になりました。

そこで、これら2つのメリット・デメリットを自分なりに列挙してみました。

コードA

b = a; // bool値を直接代入している

コードAのメリット : 低コスト

コードが1行と短いので、書くのに手間がかからない。

つまり、実装工数が小さいというメリットがあります。

コードAのデメリット : 可読性が低い

b = aというコードを見た時、これがintの代入なのか、boolの代入なのか、あるいはオブジェクトの代入なのか。

コードAから読み取れる情報だけでは変数型の判別が難しいです。
コメントが書かれていなければ変数型が判別不能

is○○ のように変数名を工夫すれば回避できそうなデメリットでもあります。


コードB

if (a) { 
   b = true; // bool値の書き換え
} else {
   b = false; // bool値の書き換え
}

コードBのメリット : 関心分離

・条件に関連する処理を追加しやすい ( = 追加実装のコストを減らせる)
a == trueの時にDebug.Logを追加したい、となった場合は一行追加するだけです。

if (a) { 
   b = true; // bool値の書き換え
   Debug.Log("a == trueです");
} else {
   b = false; // bool値の書き換え
}


・a という変数がbool型であるということがこのコードから読み取れる(=コードの可読性が高い)


「条件判定」と「値の書き換え」という2つの関心を分離しているというメリットがあるとも言えそうです。

コードBのデメリット : コード量が増える

・書くのに手間がかかる (=実装コストが増える)
・コードAよりもソースコード行数が多い

結局、どちらの書き方が良いんだろう?

コードAとコードBの両方にメリット・デメリットがあることが分かってきましたが、
結局のところ、どちらの書き方が良いのか分からなくなってきました。

悪いほうが良い(worse is better)

「悪いほうが良い」という言葉があります。

悪いほうが良い(worse is better) (http://www.kt.rim.or.jp/~hisashim/gabriel/WorseIsBetter.ja.html)

「最小限のものをまず作り、そして必要に応じて育てるほうがよい」とする考え方。

2つのコードにこの言葉を当てはめる

「悪いほうが良い」という視点で先ほどのコードAとコードBを見てみます。

コードA
「bool変数を代入する」という処理だけを行っている。
つまり、コードAは最低限の機能だけを持つ

コードB
「条件判定を行い、その後にbool変数を変更する」という複数の処理を行っている。
つまり、コードBは機能が多すぎる

コードBは悪?

最小限のものをまず作る」という視点から見た場合は

コードAは機能が最小限なのでGOOD
コードBは機能が多いのでBAD

まとめ

迷ったらコストが少ない選択肢をとるのが吉