デザインパターン入門
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 89/110。
デザインパターンは、開発者がソフトウェアを構築する際に繰り返し直面する一般的な問題に対する、実証済みの解決策です。毎回車輪の再発明をするのではなく、これらの確立されたテンプレートを適用することで、同様の課題を一貫性があり、メンテナンス可能な方法で解決できます。
デザインパターンを料理のレシピのように考えてみてください。シェフがパンを作るたびに新しい作り方を考案しないのと同様に、プログラマーは何十年にもわたって洗練されてきたパターンを使用します。これらのパターンは、クラス、継承、インターフェース、ポリモーフィズムといった、すでに学習したOOPの概念を活用し、それらを特定の方法で組み合わせて特定の問題を解決します。
デザインパターンは通常、次の3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 (Creational) | オブジェクトがどのように作成されるか | Singleton, Factory |
| 構造 (Structural) | オブジェクトがどのように構成されるか | Adapter, Decorator |
| 振る舞い (Behavioral) | オブジェクトがどのように通信するか | Observer, Strategy |
今後のレッスンでは、各カテゴリから具体的なパターンを学びます。各パターンは、クラスのインスタンスが1つだけ存在することを保証する、正確なクラスを指定せずにオブジェクトを作成する、あるいはオブジェクトが変更を他に通知できるようにするなど、それぞれ異なる問題に対処します。各パターンをいつ、なぜ使用するのかを理解することは、その実装方法を知ることと同じくらい重要です。
チャレンジ
簡単デザインパターンがどのようにコードをカテゴリ別に整理するかを示す、シンプルな問題解決システムを構築しましょう!ソフトウェアのさまざまな課題を分類し、それらを解決するためにどのタイプのパターンが役立つかを提案する構造を作成します。
コードを2つのファイルに整理します:
patterns.dart:creational、structural、behavioralの3つの値を持つPatternCategoryという名前の enum を作成します。それぞれに、その目的を説明するString descriptionフィールドを持たせてください:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problemという名前のクラスを作成します。これにはString nameフィールドとPatternCategory categoryフィールドが必要です。[name] -> Use a [category description] patternという形式の文字列を返すsuggest()メソッドを含めてください。main.dart: patterns ファイルをインポートし、異なる問題がどのように異なるパターンのカテゴリに対応するかを示します。3つのProblemインスタンスを作成してください:- 名前が
Ensure single database connectionで、カテゴリがcreationalの問題 - 名前が
Make old API work with new systemで、カテゴリがstructuralの問題 - 名前が
Notify users when data changesで、カテゴリがbehavioralの問題
suggest()を呼び出し、その結果をプリントしてください。- 名前が
このチャレンジは、デザインパターンが解決する問題のタイプによってどのように分類されるかを理解するのに役立ちます。これは、今後のレッスンで特定のパターンを学び始める際の重要な概念です!
期待される出力:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternチートシート
デザインパターンは、一般的なプログラミングの問題に対する実証済みの解決策です。これらは、OOPの概念(クラス、継承、インターフェース、ポリモーフィズム)を特定の方法で組み合わせたテンプレートです。
デザインパターンは3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 | オブジェクトの生成方法 | Singleton, Factory |
| 構造 | オブジェクトの構成方法 | Adapter, Decorator |
| 振る舞い | オブジェクト間の通信方法 | Observer, Strategy |
自分で試してみよう
import 'patterns.dart';
void main() {
// TODO: 3つの Problem インスタンスを作成してください:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: 各 problem に対して suggest() を呼び出し、結果を出力してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ