Menu
Coddy logo textTech

デザインパターン入門

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 89/110。

デザインパターンは、開発者がソフトウェアを構築する際に繰り返し直面する一般的な問題に対する、実証済みの解決策です。毎回車輪の再発明をするのではなく、これらの確立されたテンプレートを適用することで、同様の課題を一貫性があり、メンテナンス可能な方法で解決できます。

デザインパターンを料理のレシピのように考えてみてください。シェフがパンを作るたびに新しい作り方を考案しないのと同様に、プログラマーは何十年にもわたって洗練されてきたパターンを使用します。これらのパターンは、クラス、継承、インターフェース、ポリモーフィズムといった、すでに学習したOOPの概念を活用し、それらを特定の方法で組み合わせて特定の問題を解決します。

デザインパターンは通常、次の3つのカテゴリに分類されます:

カテゴリ目的
生成 (Creational)オブジェクトがどのように作成されるかSingleton, Factory
構造 (Structural)オブジェクトがどのように構成されるかAdapter, Decorator
振る舞い (Behavioral)オブジェクトがどのように通信するかObserver, Strategy

今後のレッスンでは、各カテゴリから具体的なパターンを学びます。各パターンは、クラスのインスタンスが1つだけ存在することを保証する、正確なクラスを指定せずにオブジェクトを作成する、あるいはオブジェクトが変更を他に通知できるようにするなど、それぞれ異なる問題に対処します。各パターンをいつ、なぜ使用するのかを理解することは、その実装方法を知ることと同じくらい重要です。

challenge icon

チャレンジ

簡単

デザインパターンがどのようにコードをカテゴリ別に整理するかを示す、シンプルな問題解決システムを構築しましょう!ソフトウェアのさまざまな課題を分類し、それらを解決するためにどのタイプのパターンが役立つかを提案する構造を作成します。

コードを2つのファイルに整理します:

  • patterns.dart: creationalstructuralbehavioral の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() を呼び出し、結果を出力してください
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン