スター・サーガのエピソード V のリリース 40 周年を記念して、スター・ウォーズと Java / JavaRush のすべてのファンに短い投稿を捧げます。 インターネット上で興味深いものがたくさん見つかることがあります。先日、ヨーダ条件と呼ばれる、一見するとかなり面白いプログラミング手法を見つけました。つまり、ヨーダ条件 (ヨーダ表記とも呼ばれます) は、条件ステートメント内のよく知られた比較式の 2 つの部分を逆にしたプログラミング スタイルです。
9 つの6 つの部分すべてをマラソンで見た後、眠れずに座って、自分の得意なプロジェクト用のコードを書き、次のように書きました。
if (5 == a) {
// do something
}
このスタイルは、C に似た構文を持つ言語で使用でき、ほとんどの場合、 と を使用した式で使用できif
ますwhile
。
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
なぜ定数式を比較演算子の左側にシフトするのでしょうか? 仮説的な状況を想定してみましょう。サガの
void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
この場合、プログラムを実行するたびに、メソッドにNumber is 13"
渡された引数に関係なく、 文字列を受け取ります。これは私たちが期待していたものではありません! 論理エラーは初心者プログラマーの間で非常に頻繁に発生する可能性があります (信じてください、私は知っています)。しかし、コンパイル段階では、13 = a のようなコードはエラーを生成しますが、整数値は定数であり、したがって変更できない (「a」に変わる) ため、これは絶対に見逃せません。 а
checkNumber(int a)
ヨーダの条件を使用することには賛否両論があります。
ライトサイド:
-
目的が比較である場合、変数への代入を防止します。
-
安全でない「Null 動作」の問題の解決 (
NullPointerException
) // ウィキペディアからの例
ヨーダなし:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
ヨーダさんと:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
暗黒面:
- コードを見る人にとってコードは読みやすくなり、コードの認識に対する負荷が増大します。
- 範囲が狭く、等しいかどうかの比較または定数との比較のみが使用され、null がチェックされます。
- 多くのコンパイラーはすでにこの種のエラーを「認識」しており、潜在的なエラーの存在について事前に警告します。
GO TO FULL VERSION