あれ?ASCとDESCってどっちが昇順でどっちが降順だっけ?と思わせる香ばしいコードのご紹介です。
某社のとある人(Aさん)が一人で実装した某プロジェクトで使われていたSQL周りの処理をするライブラリーの中で見つけた香ばしいコードです。 一見判り難いのですが、strcasecmp($def, "asc") に罠があって、ASCを指定してるとelse ifに入ってdescだと判定されちゃう。逆にDESCを指定するとASC扱いになっちゃう。 Aさんは自分のミスに気づかずに「あれ?ASCって降順って意味だっけ?」と毎回疑問に思いながらこの香ばしいコードを5年前から使い続けていたそうです。
//ASCは降順でDESCは昇順になります
foreach ($sort as $item => $def) {
if (strlen($sql_order_by) > 0) $sql_order_by .= ",";
if (strcasecmp($def, "asc")) $sql_order_by .= $item." ASC";
else if (strcasecmp($def, "desc")) $sql_order_by .= $item." DESC";
}
if (strlen($sql_order_by) > 0) $sql_order_by = " ORDER BY ".$sql_order_by;
{}がないのは
みなさまコメントありがとうございます。 ぜひこのコードが無事に昇天できるようディスっていただければ幸いです。
>nbuyさん 作者の人は自分が書いたコードのせいでASCとDESCがどっちだかわかん無くなって毎回テストしてからコード書いてるそうです。書いた人自身もカオスに落とし込んだウンコードに合掌!
>masarakkiさん、yuu_haraさん 確かに{}省略は読みにくくなりますよね。いろいろウンコードです。
>math_nekoさん 書いた本人は心のそこから過去の自分を恨みながらも未だにこのコードを保守しているそうです。ウンコウンコウンコード。
やっぱり、{}がないとわかりにくいな
ある意味一貫しているコードかも。
コメントにも書いてある通り、このシステムの中の "asc" とは SQL の DESC である、と作者が考えているならロジックとしては正しい。 ちょっとした工夫だが、if のインデントがミスリードを誘うように書かれているのも素敵だ。
メンテナを混乱させる素晴らしいウンコードである。:D