ヨーダ記法

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

ヨーダ記法(ヨーダきほう、Yoda notation)またはヨーダ条件式(ヨーダじょうけんしき、Yoda conditions)とは、プログラミングにおけるジャーゴンのひとつで、条件式で比較するふたつの要素を一般的な順序と逆に記述するプログラミングスタイルをいう。ヨーダ記法では条件式の左辺に定数を配置する。

映画『スター・ウォーズ』シリーズの登場人物・ヨーダが、標準的ではない英語の文法で話すことに由来する。

ヨーダ記法はWordPress[1]Symfony[2]コーディング標準の一部に採用されている。

[編集]

多くの場合、条件式は以下のように記述される。

if ( $value == 42 ) { /* ... */ }
// "もし $value が 42 と等しければ ..." と読める

ヨーダ記法では同様の式を逆に記述する。

if ( 42 == $value ) { /* ... */ }
// "もし 42 が $value と等しければ ..." と読める

定数は比較演算子の左側に書かれ、中身を調べようとしている変数は右側に書かれるという順序を、ヨーダの独特のしゃべり方(目的語-主語-動詞、OSV型[3])に見立てている。(例: “When nine hundred years old you reach, look as good you will not."[4][5]

利点[編集]

定数の位置はプログラムの挙動を変更しない(falseに評価される場合を除く。後述)。代入に等号ひとつ (=) を使い、比較はそうでない(== など)ようなプログラミング言語では、条件式のつもりで代入文を書いてしまう間違いが見られる。

if (myNumber = 42) { /* ... */ }
// 条件式として評価されず、myNumber に 42 が代入される

ヨーダ記法では:

if (42 = myNumber) { /* ... */ }
// シンタックスエラーとなりコンパイルされない

42は定数で変更されないため、このエラーはコンパイラに捕捉される。

Boolean myBoolean = true;
if (myBoolean = null) { /* ... */ }
// Java Runtime で NullPointerException が発生するが、コンパイルは通る

また、null値の危険を回避するのに使える場合もある。

String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// Javaでは NullPointerException が発生する

ヨーダ記法では:

String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// 期待通りにfalseと判定される

批判[編集]

ヨーダ記法の批判者は、可読性の欠如が上記の利点を上回っていると考えている。PythonやSwiftなどいくつかのプログラミング言語では、代入文が値を返さないようにすることで条件式中の代入を許容しないつくりになっており、この場合はこの種の不具合を作りこむことが不可能になる[6]。多くのコンパイラは if (myNumber = 42) のような記述に、記述ミスのおそれがあるとして警告を表示する(例: GCC-Wall オプションは suggest parentheses around assignment used as truth value と警告する)。

nullの振る舞いを回避できる利点についても、ヌルポインタエラーを隠蔽し発覚が遅れるという意味では欠点と考えることができる。

そのほか、C++において非基本型を == 演算子で比較する際、適切な演算子オーバーロードが存在しない場合があることも欠点に挙げられる。例: CComBSTR を文字列リテラルと比較するとき、 if (L"Hello" == cbstrMessage) と記述するとCComBSTRでのオーバーロードが使用されない[7]

関連項目[編集]

出典[編集]

  1. ^ https://make.wordpress.org/core/handbook/coding-standards/php/#yoda-conditions (日本語訳: [1]
  2. ^ http://symfony.com/doc/current/contributing/code/standards.html#structure
  3. ^ Yoda's Syntax the Tribune Analyzes; Supply More Details I Will!”. http://itre.cis.upenn.edu/~myl/languagelog/. Language Log (2005年5月18日). 2014年12月22日閲覧。 “One way to look at Yoda's syntax is that it shows signs of favoring OSV syntax (Object-Subject-Verb) as the basic order in the simple clause.”
  4. ^ The StarWars.com 10: Best Yoda Quotes”. starwars.com. Lucasfilm, Ltd. (2013年11月26日). 2014年12月22日閲覧。 “When nine hundred years old you reach, look as good you will not.”
  5. ^ Quotes for Yoda (Character)”. imdb.com. Amazon. 2014年12月22日閲覧。 “When nine hundred years old *you* reach, look as good *you* will not, hmm?”
  6. ^ https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html
  7. ^ https://msdn.microsoft.com/ja-jp/library/cfy54764.aspx

外部リンク[編集]