コンテンツへスキップ

ブーリアン地獄からの脱出!5つのコーディングルール

Five Rules to Tame Booleans in Your Code

プログラミングの落とし穴? Boolean型を使いこなすための5つの鉄則

の世界で、Boolean型(ブーリアン型)って聞いたことありますか? これは、true(真)かfalse(偽)のどちらかの値しか取らない、すごくシンプルなデータ型のことなんです。まるで電気のスイッチみたいに、オンかオフしかない、そんなイメージですね。

でも、このシンプルなBoolean型、実はなかなか手強い相手なんです。油断して使うと、コードが複雑になったり、バグの原因になったりすることも…。今回は、そんなBoolean型を安全に、そして賢く使いこなすための5つのルールを、ベテランプログラマーである私が、さんにもわかりやすく解説します!

ルール1:常にポジティブであれ!

Boolean型の変数名(変数の名前)を決めるときは、肯定的な意味を持つ名前を心がけましょう。例えば、「ユーザーが認証されている」ことを表すなら、UserIsAuthorizedのように、肯定的な状態を表す名前にします。

反対に、!UserIsNotAuthorized(ユーザーが認証されていない状態ではない)のように、二重否定を使うのは避けましょう。二重否定は頭の中で変換が必要になるので、コードの可読性が悪くなってしまいます。まるで、なぞなぞみたいで、読む人を混乱させてしまうかもしれません。

ルール2:ポジティブな条件を最初に書こう!

if...else文(もし~なら、そうでなければ~する、という条件分岐の構文)を使う場合、true(真)の場合、つまり肯定的な条件を先に記述しましょう。人間の脳は、肯定的な流れの方が理解しやすいようにできています。例えば、

if (Authorized) {
  // 許可された場合の処理
} else {
  // 許可されなかった場合の処理
}

このように、許可された場合(Authorizedtrueの場合)の処理を先に書くことで、コードが格段に読みやすくなります。

ルール3:複雑な条件式は絶対にNG!

複雑な条件式を一行で書くのは避けましょう。条件式が複雑になると、コードを読む人が内容を理解するのに時間がかかってしまいます。まるで、迷路みたいで、どこから読めばいいのか分からなくなってしまうかもしれません。

例えば、こんなコードがあったとします。

if (user.age > 18 && user.isActive && !user.isBanned && user.subscriptionLevel >= 2) {
  grantAccess(); // アクセスを許可する
}

これを、以下のように分割して、それぞれの条件に名前を付けることで、コードが非常に読みやすくなります。

const isAdult = user.age > 18; // 成人かどうか
const hasAccess = !user.isBanned; // アクセス権があるかどうか
const isActive = user.isActive; // アクティブなユーザーかどうか
const isSubscriber = user.subscriptionLevel >= 2; // サブスクリプションレベルが2以上かどうか

const canAccess = isAdult && hasAccess && isActive && isSubscriber; // アクセス可能かどうか

if (canAccess) {
  grantAccess(); // アクセスを許可する
}

それぞれの条件に意味のある名前を付けることで、コードを読む人が条件の内容をすぐに理解できるようになります。これは、まるで地図に目印を付けるようなもので、道に迷わずに目的地にたどり着けるようになります。

ルール4:Boolean型の引数(パラメータ)は悪魔のささやき

関数(処理をまとめたもの)にBoolean型の引数(パラメータ)を渡すのは、できる限り避けましょう。なぜなら、関数を呼び出すときに、引数が何を意味するのか分からなくなってしまうことがあるからです。

例えば、こんな関数があったとします。

saveUser(user, true, false); // 一体これは何を意味するのか?

このtruefalseは、一体何を意味しているのでしょうか? 関数を定義した人は分かっていても、後でコードを読んだ人は、関数の定義を調べないと意味が分かりません。

代わりに、enum型(列挙型、いくつかの選択肢の中から一つを選ぶデータ型)を使って、引数の意味を明確にしましょう。

enum WelcomeEmailOption {
  Send, // 送信する
  DoNotSend, // 送信しない
}

enum VerificationStatus {
  Verified, // 検証済み
  Unverified, // 未検証
}

こうすることで、関数を呼び出すときに、引数の意味が明確になります。

saveUser(newUser, WelcomeEmailOption.Send, VerificationStatus.Unverified); // 新規ユーザーを保存し、ウェルカムメールを送信し、未検証状態にする

このように、enum型を使うことで、コードがドキュメントのようになり、誰が読んでもすぐに意味が理解できるようになります。

ルール5:Boolean型は将来の複雑化への入り口

Boolean型は、一見シンプルに見えますが、将来的に機能を追加する際に、複雑化の原因となることがあります。例えば、飲み物のサイズを管理するシステムを考えてみましょう。

var IsSmallDrink: boolean; // 小さい飲み物かどうか

最初は、小さいサイズか大きいサイズしかなかったとしても、後から「中くらいのサイズ」が追加されるかもしれません。その場合、Boolean型の変数だけでは対応できなくなってしまいます。

最初からenum型を使って、飲み物のサイズを定義しておけば、後から新しいサイズを追加するのも簡単です。

enum DrinkSize {
  Small, // 小
  Medium, // 中
  Large // 大
}

このように、将来的な拡張性を考慮して、Boolean型以外のデータ型を選択することも重要です。

まとめ:Boolean型は賢く使おう!

Boolean型は、シンプルで便利なデータ型ですが、使い方を間違えると、コードが複雑になったり、将来的な拡張性が損なわれたりする可能性があります。今回紹介した5つのルールを参考に、Boolean型を賢く使いこなして、より読みやすく、保守しやすいコードを目指しましょう!

今回の記事では、Boolean型を扱う上での注意点を紹介しました。個人的には、シンプルさを追求するあまり、後々複雑化してしまうケースを何度も経験してきました。最初から少しだけ手間をかけることで、将来の自分、そしてチームメンバーを助けることができると信じています。

この記事は、以下の元記事をもとに筆者の視点でまとめたものです:
Five rules for coding with Booleans

関連投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です