第7章 コレクション ─ネストを解消する構造化技法─
本章では、配列・リスト・コレクションを扱う際の適切な設計や実装方法について解説する。
特に、「標準ライブラリの活用」「ネストを解消するテクニック」「低凝集を避ける設計」 に着目し、適切なコレクション処理の実装を目指す。
7.1 わざわざ自前でコレクション処理を実装してしまう
コレクションを扱う際、多くの開発者は for
ループを使って処理を実装しがちだが、標準ライブラリに同様の機能が存在しないかを確認することが重要である。
不必要な実装を避けることで、保守性を向上させ、バグのリスクを減らすことができる。
❗ 車輪の再発明を避ける
既存の技術や解決策があるにもかかわらず、新しく同じようなものを作成することを「車輪の再発明」と呼ぶ。
特に、既存の実装よりも劣るものを作ることは「四角い車輪の再発明」とされ、避けるべきである。
NOTE
車輪の再発明とは、既に確立した技術や解決策があるのに、新たに同じようなものを作ること。
四角い車輪の再発明とは、すでに存在するものよりも使い勝手の悪いものを作ること。
ただし、学習目的で再実装することは有意義である。
7.2 ループ処理中の条件分岐ネスト
コレクション内の特定の条件を満たす要素を処理する際、何も考えずに実装するとネストが深くなり、可読性が低下する。
これを解消するためのテクニックとして、「早期 continue / break を活用する」ことが有効である。
✅ 早期 continue
の活用
foreach ($items as $item) {
if ($item->isInvalid()) {
continue; // 条件を満たさない場合はスキップ
}
$item->process();
}
メリット: continue
を使うことで、対象外のデータをスキップし、処理の流れを明確にできる。
✅ 早期 break
の活用
foreach ($items as $item) {
if ($item->isTarget()) {
$item->process();
break; // 条件を満たす最初の要素を処理したらループを抜ける
}
}
メリット: break
により、無駄なループを回避し、処理効率を向上させる。
7.3 低凝集なコレクション処理
コレクション処理は分散しがちで、低凝集(関係のないコードが混在する状態)になりやすい。
これを防ぐために First Class Collection という設計パターンを採用するとよい。
✅ First Class Collection とは?
First Class Collection とは、コレクションとその操作ロジックを1つのクラスにまとめる設計 である。
これにより、凝集度が高まり、メンテナンス性が向上する。
🔹 First Class Collection の構成要素
- コレクション型インスタンス変数
- 不正な状態を防ぎ、正常に操作するメソッド
🔹 実装例(PHP)
class Orders
{
private array $orders;
public function __construct(array $orders)
{
$this->orders = $orders;
}
public function totalAmount(): int
{
return array_sum(array_map(fn($order) => $order->getPrice(), $this->orders));
}
}
メリット:
- コレクションの操作ロジックを集約できる
- コレクションを外部に渡す際にデータの不整合を防げる
🔹 コレクションの外部公開時の注意点
外部にコレクションを渡す際は、要素が変更されないようにする。
特に PHPとJavaScriptでは挙動が異なる ため、意識して実装する必要がある。
PHP の場合
return $this->orders; // 配列はコピーされるため問題ない
JavaScript の場合
getOrders() {
return [...this.orders]; // 明示的にコピーを作成する
}
注意点: return [...collection]
は要素数が多いとコストが高いため、大規模データの扱いには慎重になる必要がある。
7.4 所感
本章の内容は、これまでの章と比べて実践しやすいものが多く、日常のコーディングにすぐに活かせると感じた。
特に、以下の点が重要だと考える。
-
標準ライブラリを活用する習慣をつける
→for
を書く前に、ライブラリに類似機能がないか確認する -
ネストを減らすために「早期 continue / break」を意識する
→ 可読性を向上させる -
First Class Collection を積極的に取り入れる
→ コレクション処理を分散させず、メンテナンス性を向上させる
7.5 まとめ
本章では、コレクションを適切に扱うための設計と実装のポイントを学んだ。
特に重要なのは以下の3点である。
-
標準ライブラリを活用し、不要な実装を避ける
- 既存の機能を使えば、バグのリスクが減り、メンテナンスコストも下がる
-
ループ処理のネストを避ける
-
continue
/break
を適切に活用し、可読性を向上させる
-
-
First Class Collection を採用する
- コレクション操作を1つのクラスにまとめ、凝集度を高める
これらの原則を意識することで、よりシンプルで保守しやすいコードを書くことができる。
今後の開発でも積極的に取り入れていきたい。