17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フォースとともにあらんことを…ヨーダ記法について

Last updated at Posted at 2018-08-05

有名なプログラミング記法のひとつに、**”ヨーダ記法”**と呼ばれる記法があります。
image.png


スターウォーズに出てくるあのヨーダです。
例えば、こんなif文があったとします。 変数 value の値が100かどうかを判定するif文です。
if(value == 100) { 
  // valueが100のときにする処理
} 

ヨーダ記法では、これを以下のように書きます。ifのカッコ内に注目してください。

if(100 == value) { 
  // valueが100のときにする処理
} 

ifのカッコ内が`if(value == 100)`から`if(100 == value)`に変わっています。
ヨーダ記法では、定数(100)と変数(`value`)を倒置させて記述します。
つまり、順番を入れ替えるわけです。

処理結果はどちらも同じ。だが…

2つの例はどちらの書き方で実行しても結果は同じです。


一般的にはif(value == 100)と書く人が大多数だと思います。


でも、その書き方だとこういう間違いをしてしまうことがあります。

/*  "==" が "="になってる! */
if (value = 100){
  // 処理
}

`value`と`100`を比較したいのに、これでは`value`に`100`という値を代入してしまっています。
しかし、このコードはコンパイルが通ってしまいます。何のエラーも吐いてくれません。
なぜなら、`value=100`は”変数valueに値100を代入する”という処理として成立してしまっているからです。
でも、ヨーダ記法で同じ間違いをしてしまったときはどうでしょう?
/*  "==" が "="になってる! */
if (100 = value){
  // 処理
}

この場合はコンパイラがしっかりエラーを吐きます。
だって、`100=value`なんて処理は無理ですもんね。
つまり何が言いたいかというと…
ヨーダ記法のほうがミスを未然に防げるということです。

しかし、技術は進歩している…

ヨーダ記法はコンパイラが見落としてしまうミスを防ぐことができます。


しかし、現代のコンパイラはif (value = 100)のようなifの中に代入処理が入った記述を見つけると警告を出してくれます。

if(value = 100) { }...
// Using the result of an assignment as a condition without parentheses ←コンパイラによる警告

ヨーダ記法を使わずとも、コンパイラがエラーに気づいてくれるようになったのです。


かわいそうなヨーダ記法…。
image.png




今はもう使う必要のない記法ですが、定数と変数を倒置させるという先人たちの発想そのものは見習うべきだと感じました。

17
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?