ヨーダ記法

ヨーダ記法（ヨーダきほう、'）またはヨーダ条件式（ヨーダじょうけんしき、'）とは、プログラミングにおけるジャーゴンのひとつで、条件式で比較するふたつの要素を一般的な順序と逆に記述するプログラミングスタイルをいう。ヨーダ記法では条件式の左辺に定数を配置する。
映画『スター・ウォーズ』シリーズの登場人物・ヨーダが、標準的ではない英語の文法で話すことに由来する。
ヨーダ記法はWordPressやSymfonyのコーディング標準の一部に採用されている。
例.
多くの場合、条件式は以下のように記述される。
// "もし $value が 42 と等しければ ..." と読める
ヨーダ記法では同様の式を逆に記述する。
// "もし 42 が $value と等しければ ..." と読める
定数は比較演算子の左側に書かれ、中身を調べようとしている変数は右側に書かれるという順序を、ヨーダの独特のしゃべり方（目的語-主語-動詞、OSV型）に見立てている。（例: “When nine hundred years old you reach, look as good you will not."）
利点.
定数の位置はプログラムの挙動を変更しない（falseに評価される場合を除く。後述）。代入に等号ひとつ (codice_1) を使い、比較はそうでない（codice_2 など）ようなプログラミング言語では、条件式のつもりで代入文を書いてしまう間違いが見られる。
// 条件式として評価されず、myNumber に 42 が代入される
ヨーダ記法では:
// シンタックスエラーとなりコンパイルされない
42は定数で変更されないため、このエラーはコンパイラに捕捉される。
Boolean myBoolean = true;
// Java Runtime で NullPointerException が発生するが、コンパイルは通る
また、null値の危険を回避するのに使える場合もある。
String myString = null;
// Javaでは NullPointerException が発生する
ヨーダ記法では:
String myString = null;
// 期待通りにfalseと判定される
正確にはヨーダ記法固有の利点では無いが、比較演算子を左側に寄せることにより人によっては可読性が増すという長所もある。特にこの長所は略語を使わない文化や型なしのオブジェクト指向言語で顕著となる。(型が無い場合は名前の重複を避けるため方法につける名前が長くなりやすい)
"字句解析中に'/*'があるか判定する処理の一部"
2 = contextOfParser tokenStack size
 ifFalse:
 ^ self.
$* = contextOfParser tokenStack last
 ifFalse:
 ^ self.
$/ = contextOfParser tokenStack first
 ifFalse:
 ^ self.
例えばSmalltalkによる上記の例を差分比較用のエディターや、参考用コードを表示するため横幅を縮めて画面端に置いたエディターなどで表示すると下記のように見切れてしまう。また入れ子の関係で字下げが深くなってしまった場合も同様に見切れてしまう。
"字句解析中に'/*'があるか判"
2 = contextOfParser tokenSt
 ifFalse:
 ^ self.
$* = contextOfParser tokenSt
 ifFalse:
 ^ self.
$/ = contextOfParser tokenSt
 ifFalse:
 ^ self.
上記のように比較演算子を左に寄せている場合(結果的にヨーダ記法)は、定数と演算子により各行が何をしているか推測できるが、比較演算子を右に寄せた場合、重要な情報がすべて見切れてしまい、各行が何をしているか推測が困難となる。
"字句解析中に'/*'があるか判"
contextOfParser tokenStack
 ifFalse:
 ^ self.
contextOfParser tokenStack
 ifFalse:
 ^ self.
contextOfParser tokenStack
 ifFalse:
 ^ self.
批判.
ヨーダ記法の批判者は、可読性の欠如が上記の利点を上回っていると考えている。PythonやSwiftなどいくつかのプログラミング言語では、代入文が値を返さないようにすることで条件式中の代入を許容しないつくりになっており、この場合はこの種の不具合を作りこむことが不可能になる。多くのコンパイラは codice_3 のような記述に、記述ミスのおそれがあるとして警告を表示する（例: GCCの codice_4 オプションは "suggest parentheses around assignment used as truth value" と警告する）。
nullの振る舞いを回避できる利点についても、ヌルポインタエラーを隠蔽し発覚が遅れるという意味では欠点と考えることができる。
そのほか、C++において非基本型を codice_2 演算子で比較する際、適切な演算子オーバーロードが存在しない場合があることも欠点に挙げられる。例: codice_6 を文字列リテラルと比較するとき、 codice_7 と記述するとCComBSTRでのオーバーロードが使用されない。