質問: setTplArray_fn($data); }Copy code ```
回答: ### 答え : #### 解決: 単一のことを行うコードのブロックを専用の関数に引き出すことは、プログラミングにおける非常に一般的なベストプラクティスです。さらに、専用関数なしで再帰すると、少なくとも私の(そして私が今まで出会ったすべての人の)意見では、*コードが本当に読みにくくなります。* コードを読みやすくしたい場合は、コメントを追加してヒントを入力し、コードを少し再編成して、明確な方法で名前を付けます。 たとえば、私はあなたのコードベースについてあまり知りませんが、あなたの関数を次のように書き直します: ``` /** * @param array|string $data * @return array|string */ function sanitizeTplValues($data) { // If passed a string, just sanitize it normally if (!is_array($data)) { return htmlspecialchars($data); } // If passed an array, sanitize both the key and the values // NOTE: The value sanitization recursively calls this same function $array = []; foreach ($data as $key => $value) { $array[htmlspecialchars($key)] = sanitizeTplValues($value); } return $array; }Copy code ``` * 上部に、ほとんどすべての最新のIDEがサポートするDocBlockタグを追加しました。ここでも説明するのがいいでしょうが、それはお任せします。 * 関数の名前を変更して、(私が思うに)それが行うこととよりよく一致するようにしました * 多くの場合、`else`は実際には必要ありませんが、ここではそうです。`return``if`通過すると、配列が保証されていると頭脳が想定できます。 * 配列宣言はそこで使用されていないため、最初のブロックの下に移動しました * 私はコメントを追加しましたが、コードは「十分に明白」であると主張することができます * コードで再帰を明示的に呼び出しました。`NOTE:`構文でこれを行うことを好みますが、コメント内のメモは奇妙だと考える人もいます。 呼び出し元のコードはわずかに変更されただけで、上記の一部が適用されています。 ``` /** * @param string $key * @param array|string $data */ function setTplArray(string $key, $data) { global $tplArray; $tplArray[$key] = sanitizeTplValues($data); }Copy code ``` 私が行ったすべての変更は、業界標準の推奨事項と私自身の個人的な好みの組み合わせに基づいています。それらは決して絶対的なものではなく、自分に合ったものを選んで選ぶことができます。 私は多くの再帰コードを作成しましたが、早い段階で決定しなければならないことの1つは、「これを1つまたは2つの関数にするか」であり、99%の場合は2つの関数をお勧めします。 1つしかない場合、コードはそれ自体をブートストラップする方法を理解する必要があります。これは多くの場合、オプションのnullパラメータ、深度チェック、またはマジック値を使用して実行されますが、これらはすべて問題を引き起こしているだけです。代わりに、ブートストラップロジックを実行する1つの関数を使用でき、もう1つの関数が常に100%再帰的である場合、関心の分離が明確になり、保守がはるかに簡単になります。