MA-SATANのエンジニアブログ

とある大阪の日本酒Loveなエンジニアの開発ブログ

C/C++ ヨーダ記法ってダメなの?

ヨーダ記法ってご存知でしょうか?
if文で定数を左辺に書く記法のことです。

/* ヨーダ記法 */
if( 10 == count ) {
    return 1;
}

/* 通常の書き方 */
if( count == 10 ){
    return 1;
}

何のためにヨーダ記法を使うのか?>>

ヨーダ記法で書くと比較(==)を誤って代入(=)でコーディングした場合でも、
コンパイルエラーで発見できるので、不具合を事前に発見できることがメリット。

if( 10 = count ) { /* "=="ではなく"="になっている */
    return 1;
}

何でヨーダ記法はダメなの?

世間一般的には、ヨーダ記法は過去のもので否定派が大多数のようです。
ヨーダ記法がダメだと言われる理由は以下
①直感的ではない。(わかりにくい)
②英文として不自然。
③ワーニングを有効にすれば発見できる。

リーダブルコードでも、以下のように書かれています。

現代のコンパイラはif (obj = NULL)と書くと警告を出してくれる。したがって、「ヨーダ記法」は過去のものになりつつあると言えるだろう。

ヨーダ記法が許される条件

個人的には組み込み系などでは、ヨーダ記法使っても良いと思います。
組み込み系では移植性や安全性が求められるので。

なので、以下のような理由から、組み込み系ではいいのではないでしょうか?
①実行環境・移植先の環境のCコンパイラで警告が出る保証がない。
 組み込み系のプログラムでは、移植性が非常に重要でどんな環境で利用されるかわかりません。
 したがって、必ず警告が出る保証もない。
②もし、不具合が出てしまった場合、甚大な被害が出てしまう。
 またプログラムの更新が非常に困難。

また、仮にワーニング出ても100%修正するとは限らないしね。
警告見てない環境や人間もいるので。。。


過去に組み込み系の製品で不具合出たときは、社員総動員で莫大なコストと時間がかかりました。
もう二度と不具合は出すまいと思いました。。。
そのような経験すると、絶対的にプログラムの読みやすさよりも安全性が重要です。