gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

お仕事コードの書き方(の一部)

おいちゃん、経験的に、割合とPHPが長くなってきております。
んで、PHPでコード書くとき、割と色々と「丁寧に」書く癖があって。
特に昔は割と嫌がられたりしてたもんだけど、おかげでバージョンアップしても「平気の平左で」受け入れられるんだよなぁ、とかふと思い出しまして。
……なんて事を考えるとお仕事コードの書き方で「おいちゃんが気にしている事」があって、その辺を書いておくとなんか役に立つ事もあるのかなぁ? と思い、雑文を散らかしてみようか、と。

端的には
・キワを攻めない
に尽きるのですが……かみ砕いて。

例えばif文の評価式は最終的にbooleanが欲しいものでございます。が、関数やらメソッドやらの戻り値が、空文字だったり数値0だったりNULLだったりする事もございます。
とはいえその辺は暗黙の変換があるので

if (null !== 関数())

とか書かなくても

if (! 関数())

と書けば「nullがreturnされてきたからbooleanだとfalseだからそれの否定だから」で簡単に処理を書く事ができます。

複数の条件式があっても、括弧で囲わなくても演算子の優先順位があるから、優先順位をちゃんと理解していれば括弧なんて不要です。

型とか気にしなくても、例えば「文字が欲しい」ところに数値0書いたってよしなに解釈してくれます。

その他諸々。
言語仕様を「熟知していれば」こその、「一見不思議なんだけど、言語仕様を熟知していれば理解できる」書き方ってのは、色々とございます。

おいちゃん、上述を一通り「大変にお好まない」んですねぇ。
関数の戻り値云々で、多分これはそこそこ引っかかっている人もいたんだろうなぁと思われるstrpos()。
正直、あの問題おいちゃんは「1度も引っかかった事がない」んですが、マニュアルにも書かれているくらいなんで「結構引っかかった人もいるんだろうなぁ」とか、しみじみ。

っつかif文とかwhile文とかの条件式を書く所はちゃんと「条件式」で。
かつ、==ではなくて===で「型を意識して厳密に」。
かつ昨今なら「declare(strict_types=1);」付けて。
この辺を死守しておくと、少々ナニカがあってもあんまり困りません。

括弧はちゃんと付ける。
「これくらいは演算子の優先順位があるから」と思っても、異なる演算子があるんなら「このくくりと」「このくくりと」がわかるように、しっかりと丁寧に書く。
省略しない。

……若干悩むのが「インクリメントとかの前置と後置」ですが。
まぁPHPの界隈だと「そのテクニック使うな」って言われる事が多いですかねぇ。なので使わないようにしてます。

「ンなこと言ったってその辺の挙動、そうそう変わらないよ」ってよく言われるんですが。
【PHP8.0】非厳密な比較演算子`==`の挙動が今さら変更になる https://qiita.com/rana_kualu/items/82cc8295d2102d14b88a
【PHP8.0】演算子.と+の優先順位が変わる https://qiita.com/rana_kualu/items/db7ae541016bd0b02122
諸行無常。一切のものは流転し変化し、変わるものでございます。

まぁ関数やメソッドの戻り値は「falseかしら? NULLかしら?」って調べるのが若干面倒かもしれませんが。
括弧付けるくらい、そんなに手間ですかしらん?
って思ってるです正直。

こーゆー思想で作ってるので。
(最近、Slimにどっぷりハマって放置してますが)自前のフレームワーク、PHP5からPHP7に対応させるとき、ほぼ修正いらずでした(一桁行くらいだったかし、修正したの)。
逆にこの辺が雑なコードをPHP5からPHP7に移植させるとき、驚くほど手間がかかりました。

いやまぁ「いつどこにコストをかけるのか?」って話なんだろうとは思うのですが。
どうせなら「その言語にちょっとくらい不慣れな人」が読んでもすんなり読めるような、丁寧なコード書いてたほうが色々とメリットも多いんじゃ無かろうか? と思うんですが、どうなんですかねぇ?