プログラミング 用語 では、ヨーダ条件(ヨーダ記法とも呼ばれる) とは、式の 2 つの部分が条件文の通常の順序と逆になっているプログラミング スタイルです。ヨーダ条件では、式の定数部分が条件文の左側に配置されます。
ヨーダ条件はSymfony [1]とWordPress [2]のコーディング標準の一部です。
起源
このプログラミングスタイルの名前は、非標準的な構文で英語を話すスターウォーズのキャラクター、ヨーダに由来しています[3](例:「900歳になっても、今まで以上に元気に見えなくなる」[4] [5] )。トーマス・M・トゥルケは、ヨーダ記法という用語を作り出し、2006年に初めてオンラインで公開したと主張しています。 [6]彼によると、ヨーダ条件という用語は、後に2010年にフェリックス・クルーティエによって普及しました。
例
通常、条件文は次のように記述されます。
if ( $value == 42 ) { /* ... */ } // 次のように記述されます: 「値が 42 に等しい場合...」
ヨーダ条件は同じ表現を逆順に記述します。
if ( 42 == $value ) { /* ... */ } // 次のように記述されます: 「42 が値と等しい場合...」
アドバンテージ
論理的に連鎖した比較の可読性
Pythonなどの一部の言語では、構文で「連鎖」比較演算子(「コンパレータ」)をサポートしています。[7]したがって、次の行は論理的に同等です。
# 連鎖比較器の使用:
if 3.14 < y <= 42 : ...
# 論理的には次の式と同等:
if ( 3.14 < y ) and ( y <= 42 ): ...
2 番目の形式では、左側の比較 ( ) で自然に Yoda 構文が使用されていることに注意してください。Yoda 構文を使用しない3.14 < y同じ行を考えてみましょう。
( y > 3.14 ) かつ ( y <= 42 )の場合: ...
手書きで数式を書く場合、多くの著者は「連鎖」表記法 (例、例) を好みます。連鎖表記法を文字通りサポートしていない言語でプログラミングする場合、著者は少なくとも視覚的には馴染みのある連鎖表記法を想起させる Yoda 構文を好む場合があります。
プログラマーのミスの検出
等価性などの対称比較の場合、左オペランドと右オペランドを入れ替えてもプログラムの動作は変わりません。代入式に単一の等号( =) を使用するプログラミング言語では、等価性比較を意図した場所に誤って代入式を記述してしまう
可能性があります。
if ( myNumber = 42 ) { /* ... */ } // これは、目的の条件を評価する代わりに、myNumberに42を割り当てます。
ヨーダ条件を使用する:
if ( 42 = myNumber ) { /* ... */ } // これはエラーなのでコンパイルできません
などのリテラル式は代入可能ではない(「 lvalue42 」ではない)ため、Yoda 条件での代入等価性の混乱は、コンパイル時のセマンティック エラーとして現れることがよくあります。
Boolean myBoolean = null ; if ( myBoolean == true ) { /* ... */ } // これは、Java ランタイムでは NullPointerException を引き起こしますが、コンパイルでは有効です。// これは、Java が null オブジェクトで myBoolean.booleanValue() を呼び出そうとするため発生します。
動的ディスパッチのターゲットの変更
ほとんどのオブジェクト指向プログラミング言語では、メソッド呼び出しの受信者は、呼び出しの他の引数の左側に記述されます。同時に、非ヨーダ比較では、比較の対象となる変数が左側に記述されます。したがって、比較メソッド呼び出しは通常、比較されるオブジェクトに動的にディスパッチされますが、これは必ずしも望ましいとは限りません。
String myString = null ; if ( myString . equals ( "foobar" )) { /* ... */ } // これは Java で NullPointerException を引き起こします
Yoda 条件を使用すると、代わりに定数オブジェクトに呼び出しをディスパッチできます。
String myString = null ; if ( "foobar" . equals ( myString )) { /* ... */ } // これは、NullPointerException をスローせずに false に解決されます
批判
ヨーダ条件は、コードを読む際の認知負荷を増加させることで可読性を損なうと批判されている。 [8] [9] [10]
一部のプログラミング言語( Swift、Kotlin 、 Python 3.8未満のバージョンなど)では、条件文内での変数の代入が許可されていません。たとえば、代入が値を返さないことを要求したり、条件に代入文を含めることができないという不変条件を文法の一部として定義したりすることで、このエラーが発生することはありません(つまり、プログラムがランタイムに入る前に、パーサーによって構文エラーとして検出されます)。[11] 多くのコンパイラーは、次のようなコードに対して警告を発します(たとえば、GCCオプションは、を真理値として使用する代入を括弧で囲むことを推奨します )。これは、プログラマーに起こりそうな間違いを警告します。JavaScriptのような動的言語では、ESLintなどのリンターが条件文内での代入に対して警告を発することができます。 [12] Python 3.8では代入式が導入されましたが、と単純に混同するバグを回避するために、通常の等号(=)ではなくセイウチ演算子を使用しています。[13]if (myNumber = 42) -Wall:====
C++では、非基本型を比較するときに==が演算子であり、適切なオーバーロードされた演算子関数が定義されていない可能性があるため、別の欠点があります。例:として記述された文字列リテラルCComBSTRに対するMicrosoftの比較は、オーバーロード関数にマップされません。[14]if (L"Hello" == cbstrMessage)
参考文献
- ^ 「コーディング標準 (Symfony への貢献)」。Symfony.com。2016年11 月 12 日閲覧。
- ^ 「PHP コーディング標準 | コーディング標準ハンドブック」。WordPress開発者リソース。2021年7 月 25 日閲覧。
- ^ Pullum, Geoffrey K. (2005 年 5 月 18 日). 「トリビューン紙が分析するヨーダの構文; 詳細は私が提供します!」. Itre.cis.upenn.edu . Language Log . 2014 年12 月 22 日閲覧。
ヨーダの構文を見る一つの方法は、単純な節の基本的な順序として OSV 構文 (目的語-主語-動詞) を好む兆候が見られることです。
- ^ 「The StarWars.com 10: Best Yoda Quotes」. starwars.com . Lucasfilm, Ltd. 2013年11月26日. 2014年12月22日閲覧。
900歳になっても、これほど美しい姿でいられるだろうか。
- ^ 「ヨーダ(キャラクター)の名言」。imdb.com。Amazon。2014年12月22日閲覧。900
歳になった*あなた*は、こんなに格好良くないでしょうね、ん?
- ^ 「ヨーダ記法(別名ヨーダ条件)—用語の由来」。2013年4月17日。 2020年12月26日閲覧。
- ^ 「比較」。Pythonライブラリ リファレンス。Python Software Foundation。2008 年。
- ^ Paris, Grégoire (2020年1月24日). 「Yoda条件を使用するべきではない理由」. DEV Community . 2022年1月30日閲覧。
- ^ Classic, Mike (2017年8月16日). 「ヨーダ条件:なぜ使用すべきではないのか」mikeclassic.ca . 2022年1月30日閲覧。
- ^ Contieri, Maxi (2023年2月7日). 「コードスメル195 - ヨーダ条件」. Maximiliano Contieri - ソフトウェア設計. 2024年5月22日閲覧。
- ^ 「基本演算子 — Swift プログラミング言語 (Swift 5.6)」。docs.swift.org。Apple。2022年1月30日閲覧。
- ^ 「条件文で代入演算子を使用できない」eslint.org . 2022年1月29日閲覧。
- ^ Angelico, Chris; Peters, Tim; van Rossum, Guido (2018 年 2 月 28 日). 「PEP 572 -- 代入式」. Python.org . 2021 年7 月 18 日閲覧。
- ^ 「CComBSTR クラス」。docs.microsoft.com。Microsoft。2021年 8 月 3 日。2022 年1 月 30 日に閲覧。
外部リンク
- ヨーダの条件とは?ウェイバックマシンにて(2022年9月30日アーカイブ)
- ヨーダの条件は非常に有害であるように思われるこの技術に対する批判は、それが良いことよりも害をもたらす可能性があると主張している
