---
# System prepended metadata

title: クソコードグランプリに出すコードの説明

---

# クソコードグランプリに出すコードの説明

# 使用環境

PHP、Docker、MySQL

# コードの場所
コードは「src/PHPCODE/FizzBuzz.php」
必ず確認して!!!!!!!!!!!!!!!!!!!!!!!!!
# FizzBuzz処理フロー

## ①データベースからFizzBuzzテーブルを取得
## ①csvからFizzBuzzデータを読み込み配列に格納
## ②データベースとは別にローカル検証用のFizzBuzzテーブルを連想配列として作成
## ③FizzBuzzの検証を開始(100までループする)
## ④Fizzの場合にtrueになる「fizzフラグ」、buzzの場合にtrueになる「buzzフラグ」を用意
## ⑤条件分岐の結果によってFizzBuzz用の例外を投げる
1. $iが3で割り切れる、かつ5で割り切れない、かつbuzzフラグがtrueではない、かつローカル検証用のFizzBuzzテーブルの$i番目のmessageが「Fizz」の場合にfizz用の例外を発生させる。例外には$message(Fizz)、$id($iの値と同じ)を渡す

2. $iが3で割り切れない、かつ5で割り切れる、かつfizzフラグがtrueではない、かつローカル検証用のFizzBuzzテーブルの$i番目のmessageが「Buzz」の場合にbuzz用の例外を発生させる。例外には$message(Buzz)、$id($iの値と同じ)を渡す

3. $iが3で割り切れる、かつ5で割り切れる、かつローカル検証用のFizzBuzzテーブルの$i番目のmessageが「FizzBuzz」の場合にfizzbuzz用の例外を発生させる。例外には$message(FizzBuzz)、$id($iの値と同じ)を渡す

上記1〜3の要件に該当しなければ$iをそのまま出力

## ⑥例外を処理する
1. Fizz例外が発生した場合、
fizzフラグをtrueにする
データベースのFizzBuzzテーブルの$i番目のmessageとローカル検証用のFizzBuzzテーブルの$i番目のmessageが同じ、かつデータベースのFizzBuzzテーブルの$i番目のmessageと例外から取得したメッセージ($message)が同じ場合、正規表現マッチングを行う
上記の比較で一部でも異なる場合があれば、無限ループで「それホントにFizzなの?」と出力
2. Buzz例外が発生した場合、
buzzフラグをtrueにする
データベースのFizzBuzzテーブルの$i番目のmessageとローカル検証用のFizzBuzzテーブルの$i番目のmessageが同じ、かつデータベースのFizzBuzzテーブルの$i番目のmessageと例外から取得したメッセージ($message)が同じ場合、正規表現マッチングを行う
上記の比較で一部でも異なる場合があれば、無限ループで「それホントにBuzzなの?」と出力
3. FizzBuzz例外が発生した場合、
データベースのFizzBuzzテーブルの$i番目のmessageとローカル検証用のFizzBuzzテーブルの$i番目のmessageが同じ、かつデータベースのFizzBuzzテーブルの$i番目のmessageと例外から取得したメッセージ($message)が同じ場合、正規表現マッチングを行う
上記の比較で一部でも異なる場合があれば、無限ループで「それホントにFizzBuzzなの?」と出力

## ⑦正規表現マッチング
1. Fizzのチェック
$messageの正規表現チェックをして"/^Fizz$/"に該当すればそのまま$messageを出力
該当しなければ無限ループで「それホントにFizzなの?」と出力
2. Buzzのチェック
$messageの正規表現チェックをして"/^Buzz$/"に該当すればそのまま$messageを出力
該当しなければ無限ループで「それホントにBuzzなの?」と出力
3. FizzBuzzのチェック
$messageの正規表現チェックをして"/^FizzBuzz$/"に該当すればそのまま$messageを出力
該当しなければ無限ループで「それホントにFizzBuzzなの?」と出力

# コードのアピールクソポイント
①FizzBuzzを出力するのに「ローカルでの照合」、「データベースとの照合」、「正規表現マッチング」の三重チェックを行っている。
つまり、出力されたFizzBuzz文字列は厳しい検査をくぐり抜けた選りすぐりのエリートである。

②「fizzフラグ」、「buzzフラグ」は正しく機能しているように見えるが実は何の役割も果たしていない。理由は1ループ1FizzBuzzチェックなので次のループに移動すればフラグも初期化されてしまうから。従って、例外処理の中にあるgetTrueFlugメソッドも無駄な処理である。

③独自例外クラス内でgetCodeメソッドをオーバーライドしているが、正しい用途で使っていない。
本来getCodeメソッドは起こった例外のハッシュコードを返すべきだが、今回はFizzBuzzの検証用の値$iをそのまま入れている。例外の仕組みを理解している人を混乱させるためのコードとなっている。

④一つでもFizzBuzzの照合に失敗したら無限ループを発する「メモリークラッシャー」を入れている。今回は厳重なチェックのもと、メモリークラッシャーは機能しないと信じたいが機能してしまったら大変である。

⑤FizzBuzzのcsvデータは読み込むだけ