がるの健忘録

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

「ジャッジをしない(するのが面倒くさい)」という選択

発端は、PHPで割と定期的に見る、こんなコードに起因したお話でございます。

if (!hoge()) {
    処理
}

まぁ関数でも変数でもよいのですが。
この辺を「良し」とする勢と「悪し」とする勢がいる、と認識をしておりまして。
おいちゃんは「良しとはしない勢(悪し勢の弱い目のあたり)」に生息をしております……んですが、「なんで?」ってな辺りのお話でございます。

まぁご大層な理屈とか理念とか理想とかがある、って分けでもございませんで。
端的に片付けると「ジャッジするのが面倒だから」というものぐさ精神の賜物、でございます(笑

もうちょいとかみ砕きまして。

この「ifの中を"論理演算子の否定"だけで書く」のが確実にまずいケースの典型例としては、strpos()があろうか、と思います。
この辺は最近あちこちでとやかく言われていると思われるので、説明は略。

$s = 'abcdef';
if (!strpos($s, 'a')) {
    echo "a is not find.\n";
}

あと、ちょっと思いつかないのですが、戻り値が「string|false」な関数なんかも「文字としての"0"がかえってくる」とアウト風味が満載でございます。

function f() : string|bool {
    return '0';
}

if (!f()) {
    echo "f() is false\n";
}

まぁ「空文字とか空配列とかNULLとか」がfalseになるくらいは、暗黙の変換でも「許容範囲かなぁ」と思わなくもないんですけど、……ねぇ。
この辺の「これの戻り値どうなんだろう?...暗黙の変換どうなるんだろう?」を毎回確認するくらいなら「暗黙の変換やめて明示すりゃよくね?」とか思ってきたりするわけですよ。

書く方は一回だけど、読む方は下手すりゃ毎回だったりしますしねぇ。

この辺の根っこに「決断には、案外とMPがかかる」って認識があるです。
例えば、こちら。
https://www.workport.co.jp/plus/articles/7576

あと、間違ったコードは間違って見えるようにする( 今、キャッシュしかないんですよねぇ…… https://web.archive.org/web/20190317182904/http://local.joelonsoftware.com:80/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B )的な事も少し想起しています。

なので。
おいちゃんが「if文の中は必ず条件式。論理演算子(否定)を書かない」のは「戻り値がどうなってその結果のbooleanへの暗黙の変換がどうなって...」って考えたり「この戻り値はOKで...この戻り値はNGだから...」とかいう決断をしたりするのが面倒だから、になります(笑