okuzawatsの日記

Android / Kotlin / GitHub Actions Enthusiast 🤖

短絡評価を乱用しないでください🙅‍♂️

多くのプログラミング言語では、論理演算は短絡評価されます。Kotlinの文法であれば、 a && ba がfalseであれば b は評価されず、 a || ba がtrueであれば b は評価されないということです(無駄なので)。

これを利用して、ハック的なコードを書くことが可能です。

わかりやすい例を提示します。以下のコードでは、 someBool() がtrueを返した時は some() のブロック内の処理は短絡評価されるため、 doSomething() は評価されません。一方、 someBool() がfalseを返した時は doSomething() が評価されます。

fun some() {
  someBool() || doSomething()
}

fun someBool(): Boolean = Random.nextBoolean()

fun doSomething(): Boolean {
    println("do something here")
    return true
}

この && || の短絡評価を利用すると、 someBool() がtrue / falseの時にだけ特定の処理を行う、という処理を書くことができるわけですが、あまり行儀が良くないので1、基本的にはやめましょう。

今回の例はまだわかりやすいですが、 if (someCondition() || anotherCondition()) {} のように、 if の条件式内で何らかの副作用が発生するような短絡評価の乱用は、厳に慎むべきでしょう。


Kotlinには、 and 演算子と or 演算子が存在します。これらの演算子はそれぞれ && 演算子と || 演算子と似ていますが、 and 演算子と or 演算子は短絡評価されず、完全評価されます。すなわち、演算子の左側の値がtrueだろうがfalseだろうが、右側の値も評価される、ということです。

こちらはこちらで、無駄に処理が行われてしまうことにつながるため、注意が必要です。


  1. 個人の見解です。 ↩︎

書いている人 😎

profile

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。

👉 もっと詳しく

著書 ✍

Android クリーンアーキテクチャ ヒッチハイク・ガイド 🧳

Androidアプリでのクリーンアーキテクチャに入門するためのガイダンスです。クリーンアーキテクチャの概念を理解し、Androidアプリに適用する方法を解説しています。

販売サイトへ 🏃

Android ユニットテスト ヒッチハイク・ガイド 🧳

Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。

販売サイトへ 🏃

Android MVVMアーキテクチャ入門 🛠

Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。

販売サイトへ 🏃

お問い合わせ✉️

Androidアプリ開発、特にレガシープロジェクトに関するご相談はこちらまで📨

お名前

メールアドレス

お問い合わせ内容