Booleanを使うときありがちなバグを避ける方法
一度ダイアログ表示していたら次は出さないとか、未読既読とかちょっとした設定をBoolean値で判断することがよくありますが、かつてその手の実装でよくハマったことと対応策としてミスりにくい考え方をまとめてみました。
具体的に起こるミスとしては下記のようなものがあります。
- 0と1で表されているかtrue/falseか不確定
- 文字列で"false"と表現されている
- 値が空の場合も考慮しなければいけない
こういう状況でおこるうる問題としては、
- 単純にプログラムに慣れていないのでミスる
- 他人に引き継いだときに困る
- 実装に自信がもてずに時間がかかる
- 昨日の自分を信用出来ない
- APIの仕様がなにかと信用出来ない
という感じでしょうか。 まぁ、実際にはたかがBooleanなので大したことはないのですが、眠さや疲れや焦りなんかがチリも積もってバグとなるわけなのです。
この手の実装をするときには、事前にきめた正しいもの以外はfalseという「ホワイトリスト」という考え方で実装するといいです。
var boolA = config.isRead === true; var boolB = $("script#config").text() === "true";//仮にHTMLとかテキスト情報で記載しなければいけないとき
こういう感じで常に実装するように心がけておけば、初心者でも混乱しにくいし、疲れてても判断しやすいのでオススメです。 初心者というより中級者くらいにありがちな「かっこよさげな記法で書きたくなる病」とか「むやみにクソ丁寧なif文を書きたくなる病」にかかっているときのほうが危険ですので、シンプルで迷いのない表現をこころがけましょう。自戒をこめて。
たぶんJSONとかであればBooleanをそのままかけるのでいいですが、特にWebAPIから取ってきた値(かつ0/1とか)だったり、Cookieとか設定ファイルとか文字列で保存しないといけないときは、文字列できたりするので、特定の表記以外をfalseにすれば安全だと思います。
最悪、値が0/1で数字がくるか文字列がくるかわからないようなときは、下記のようにいったんtoString()したものを文字列と比較すると良いと思いますが、そんなことしないでも良い設計にするべきだと思いますので参考程度に。
var boolC = config.isRead.toString() === "1";