この記事は?
PHP、個人的には「書けば動く感」とか、ゆるい感じが気に入っていたりします。
しかし仕事で書く場合は特に、他の人が見て「ある程度」分かる必要があります。
僕が数ヶ月間、✙闇✙の深いシステムのメンテナンスを担当して「ここは気をつけたい」と感じた部分をまとめたいと思います。
ループ処理
例えば、配列をforeachなんかで回したい場合...
$arr = [0, 1, 5, 0, 3];
$filtered_arr = [];
foreach ($arr as $key => $val) {
if ( ! empty($val)) {
// ここになにか処理を書く
echo "{$key} is not 0 : {$val}";
$filtered_arr[] = $val;
} else {
continue;
}
}
こういうコードがあった時、個人的に気に食わない点があります。
まず、ここですね。
if ( ! empty($val)) {
if文の順番
メイン処理の分岐とcontinueするときの分岐がありますが、その順番を逆にした方が良いですね。
こんな感じに。
if (empty($val)) {
continue;
}
// ここになにか処理を書く
echo "{$key} is not 0 : {$val}";
$filtered_arr[] = $val;
なぜかといいますと、先程の例では、メイン処理が「echoして配列に突っ込む」だけなので、まだいいのですが、
「メインの処理を把握し終わって(読み終わって)初めて、continueを発見できる」ことになるので、
処理の流れを把握しづらいです。
「if文見つけた時点でelse文見ろよ」って方もいらっしゃるかもしれないですが、そもそも上の書き方をしておけば、
continueを発見するのにそんな手間はいらないのです。
「処理の流れが把握しづらい」ってのがキモですね。
empty使わないで...
empty関数はPHPマニュアル によると変数が空であるかどうかを検査する
とあります。
ただ、実際のところ、これが真になる条件は
- null
- false
- 空文字
- 要素が0個の配列
- 変数が宣言されているが、値が設定されていない
のように、いくつかあります。
要するに、どの条件をチェックしているのか明確ではないのです。
僕は
if (strlen($str) <= 0) {}
if (count($arr) <= 0) {}
if ($intval <= 0)
のように、「どんな値になることを期待しているのか明確にする」ことを意識してに書くようにしています。
車輪の再開発しないで
そもそもですが、array_filter使えよってお話ですよ。
$arr = [0, 1, 5, 0, 3];
$filtered_arr = array_filter($arr, function($val) {
return ($val !=== 0)
});
foreach ($filtered_arr as $val) {
echo "{$key} is not 0 : {$val}";
}
クラス設計
/*ShopCartController.php*/
class ShopCartController {
// カートに入ってる商品の合計を返す
public function item_total_amount() {}
}
/*ShopOrderController.php*/
class ShopOrderController {
// カートに入ってる商品の合計を返す
public function get_allitem_amount() {}
}
さすがにこれは大丈夫ですよね。
「馬鹿馬鹿しい...」とお思いかもしれないですが、
実際にあった話です
ですし、書くべき場所に書きましょう。こういう処理はちゃんとまとめましょう。
あと当然ですが、まとめるべき場所はコントローラではないです。
さいごまでありがとうございます
以上です。