PHPer が思考を止めないために


言うまでもなくエンジニアにとって「考える」のは重要なことです。
ですが深く考えずにコードを書くことはよくあると思います。
コピペ、設計、インデント、等々。
それらは本当に正しいのでしょうか?思考停止してしまってはいないでしょうか?

時間は有限です。考えることが大事だからと言って意味のないことにまで考える時間を費やしていてはいくら時間があっても足りません。
本題に入る前にエンジニアが何に時間を費やすべきか少しばかり考えてみましょう。
例えばなぜインデントを揃えるのでしょうか?
エンジニアがそこで手を止めなくていいようにするためです。
読みにくいコードを頭の中で整理する時間はプログラミングにとって本質的ではない無駄な時間です。
そんなことに時間を使うよりは少しでも本質的なコードの設計を考える時間に費やした方がいいでしょう。


それでは本題です。
今回は PHP 特有の and/or という 論理演算子 について考えてみようと思います。
&&/|| の代わりに使える演算子です。もちろん普通に &&/|| も使えます。

数ある言語の中で and/or という演算子があるのは PHP だけです。
少なくとも主要言語である C, C++, C#, Java にはありません。
もしかしたら他の言語にはあるかもしれませんが少数派ではあるでしょう。
先に “普通に” と書いたのはそういう理由です。

それでは PHPer はどちらの演算子を使うべきでしょうか?
PHP フレームワークのコード規約やテンプレートエンジンを参考にしようと思いましたがあまり定義されていないようです。
FuelPHP: and/or
CodeIgniter: &&/or
PSR-2, Laravel, CakePHP, Symfony, WordPress, Smarty, Blade: 未定義

私は CodeIgniter と FuelPHP を使うことが多かったので and/or を使うのかーと思った記憶があります。
実際のコードは他言語との兼ね合いから &&/|| を使って書いていましたが。
Smarty では非エンジニアの方も触ることがあるので and/or が使われていることが多い印象です。


ところでこの2種類の演算子、本当に同じものなのでしょうか?
論理演算子のページにはこう書いてあります。

“and” および “or” 演算子が 2 種類あるのは、演算が行われる際の優先順位が 異なっているためです (演算子の優先順位 を参照ください)。

つまりどちらを選ぶかによってコードの実行順序が変わってきます。
具体的には $a = false || true; だと $a は true ですが $a = false or true; だと false になります。

PS C:\> php -r '$a = false || true; var_dump($a);'
bool(true)
PS C:\> php -r '$a = false or true; var_dump($a);'
bool(false)

このような代入、書くことありますよね。
今まで書いたコードでは正しく書けているでしょうか?
もしかしたら &&/|| 演算子を使っている方は自信を持って答えられるかもしれません。
では and/or を使っている方はどうでしょう?優先順位、意識していましたか?
少なくとも私は優先順位が違うことはこの記事を書くまで知りませんでした。


それではあなたのコードではどちらを選ぶべきでしょうか?
優先順位を考えると &&/|| の方がいいのでは?と思った方がいるかもしれません。
ですがテンプレートエンジンとして書くなら優先順位が求められるようなコードを書くことはないでしょうし and/or の方が非エンジニアの方にも分かりやすくていいかもしれません。
他言語を使っていた経験の多い方がチームでロジックコードを書いているなら &&/|| の方が手を止めずに済むかもしれません。
結局はケースバイケースでしかないのです。
思考を止めずにメリット/デメリットを比較して自分のコードに適切な方を選びましょう。


カテゴリー: 雑記 タグ: パーマリンク