Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2025-04-23 社内勉強会 デザインパターン概論 / Overview of Desig...

2025-04-23 社内勉強会 デザインパターン概論 / Overview of Design Patterns

Avatar for Kentaro Abe

Kentaro Abe

April 23, 2025
Tweet

More Decks by Kentaro Abe

Other Decks in Programming

Transcript

  1. 1. リファレンスを読む 2. ツールを深く理解する 3. エラーメッセージを読む 4. 問題を分解する 5. 手を汚すことを恐れない

    6. 常に他者を助ける 7. 書く習慣を持つ 8. 学び続ける 5 The Best Programmers I Know 9. 地位を気にかけない 10. 評判を確立する 11. 忍耐力を持つ 12. コンピューターを責めない 13. 「わからない」と言うことを 恐れない 14. 推測しない 15. シンプルに保つ
  2. 1. リファレンスを読む 2. ツールを深く理解する 3. エラーメッセージを読む 4. 問題を分解する 5. 手を汚すことを恐れない

    6. 常に他者を助ける 7. 書く習慣を持つ 8. 学び続ける 6 The Best Programmers I Know 9. 地位を気にかけない 10. 評判を確立する 11. 忍耐力を持つ 12. コンピューターを責めない 13. 「わからない」と言うことを 恐れない 14. 推測しない 15. シンプルに保つ この7つを紹介
  3. 7 • 理解しなくてもツールは使える(それがツール) • 優れた開発者は、自分が使っている技術を根本的なレベルで理解している • ツールをただ使っているだけでは、手探りで試行錯誤したり、 すぐに混乱したり、間違った考えを持ってしまう • ツールを理解するとは、以下を知ること

    ◦ 歴史:誰が作ったもの?なぜ作った?どんな課題を解決するため? ◦ 現状:誰が管理している?その人はどこでどんな仕事をしている? ◦ 制限:いつ使うべきか、または使わないべきか?どう使うと壊れる? ◦ エコシステム:どんなライブラリが存在する?誰が使っている? ツールを深く理解する Know Your Tools Really Well
  4. 12 • コンピューターの動作がどんなに不安定でいたずらに見えても、 常に論理的な理由がある • 最高の開発者は、理由が見つかるまで深掘りする • 理由はすぐには見つからないかもしれないし、結局見つからずに 終わるかもしれない •

    見つけられなくても、彼らは外部の状況のせいにしない • この態度によって、彼らは大きく成長し、他の人にはできないことを学ぶ コンピューターを責めない Never Blame the Computer
  5. 13 • 推測は楽なので、我々は推測してしまいがち • 推測すると何が起きるか? ◦ 最良の場合: ▪ あなたは間違っていて、間違った仮定がバグを生む ◦

    最悪の場合: ▪ あなたは正しく、偶然うまくいったことを正解だと思い込んでし まう • 質問したり、リファレンスを読んだり、デバッグしたりして、 答えを得ることが大事 推測しない Don’t Guess
  6. 32 • 言語自体が機能として提供したり、デザインパターンにしたがって 設計されたフレームワークが増えた ◦ 例えば、Java や C# はデザインパターンにかなり影響を受けている •

    デザインパターンを使いこなせば、より簡潔に書けたり、 フレームワークの機能を拡張できたりする なぜデザインパターンを学ぶのか? 3. 言語やフレームワークに取り込まれている
  7. 35 生成 🐣 • Abstract Factory • Builder • Factory Method

    • Prototype • Singleton パターン一覧( 23種) 構造 🏛 • Adopter • Bridge • Composite • Decorator • Facade • Flyweight • Proxy 振る舞い 🕺 • Chain of Responsibility • Command • Interpreter • Iterator • Mediator • Memento • Observer • State • Strategy • Template Method • Visitor 投票 進む 参考:Refactoring.Guru
  8. 37 状況と問題 • たくさんのフィールドをもち、 複雑な初期化が必要なクラス • 状況に応じたサブクラスを 作るのは非現実的 • コンストラクタの呼び出しで

    使われないパラメータを大量に渡す必要がある Builder 複雑なオブジェクトを段階的に構築する 一覧 参考:Refactoring.Guru 🐣
  9. 38 解決方法 • オブジェクトの構築をBuilderクラスに抽出 • Builderの実装ごとに、各ステップで実施する 内容は異なる • すべてのステップを呼び出す必要はない •

    構築中にProductにアクセスすることは 禁止する Builder 複雑なオブジェクトを段階的に構築する 一覧 参考:Refactoring.Guru <<interface>> Builder reset() buildStepA() buildStepB() buildStepZ() ConcreteBuilder result:Product reset() buildStepA() buildStepB() buildStepZ() getResult():Product 実装 🐣
  10. 解決方法 • LeafとCompositeはどちらも 共通のインターフェースを実装する • Leafは自分が何をするべきか 知っている • Compositeはchildrenに処理を 委任する

    43 Composite ツリー構造を表現する 一覧 参考:Refactoring.Guru 🏛 <<interface>> Component execute() Composite children:Component[] add(Component) remove(Component) getChildren():Component[] execute() 実装 Leaf execute()
  11. 44 状況と問題 • 例えば、システム資源を大量に消費するオブジェクトがある ◦ データベース ◦ 外部のライブラリ • 遅延初期化のようなテクニックを使う場合、あちこちに似たような処理を書

    くことになる • 処理の前後でログ出力をする場合なども同様 Proxy オブジェクトへのアクセスの前後に処理を行う 一覧 参考:Refactoring.Guru 🏛
  12. 45 解決方法 • 元のオブジェクトと同じ インターフェースを持つProxyクラス • Proxyクラスはリクエストを受けると 必要な処理を行って、元のオブジェクトに 処理を移譲する Proxy

    オブジェクトへのアクセスの前後に処理を行う 一覧 <<interface>> ServiceInterface operation() Proxy realService operation() 実装 Service operation() 参考:Refactoring.Guru 所有 🏛
  13. 47 状況と問題 • 配列やコレクションはよく使う • 一つずつ取り出すのは自然な要求 • コレクションの構造は様々 • 「取り出し方」を毎回実装するのはとても手間がかかる

    • 要素を扱う側にとって、取り出される順番には興味がない Iterator たくさんあるものの中から一つずつ取り出す 一覧 参考:Refactoring.Guru 🕺
  14. 48 解決方法 • 「取り出し方」をIteratorクラスに抽出する • 使う側は、コレクションの構造を気にせず インターフェースを通して要素を取得する • ConcreteIteratorを必要に応じて作る ◦

    異なるコレクション ◦ 異なる探索方法 Iterator たくさんあるものの中から一つずつ取り出す 一覧 <<interface>> Iterator getNext() hasMore():bool ConcreteIterator collection getNext() hasMore():bool 実装 参考:Refactoring.Guru 🕺
  15. 50 解決方法 • 一つの状態ごとに一つのクラスを作り、 状態固有の振る舞いを抽出する • コンテキストと呼ばれる元々のオブジェクトが、 Stateへの参照を持ち、Stateに状態関連の作業を 委任する •

    特定のState同士はお互いの存在を知っている State 状態によって振る舞いを替える 一覧 参考:Refactoring.Guru <<interface>> State render() publish() 実装 Draft document:Document render() publish() Document state:State render() publish() changeState() 所有 🕺
  16. 52 Design Patterns 15 Years Later: An Interview with Erich

    Gamma, Richard Helm, and Ralph Johnson GoF本の出版から15年後の2009年に行われた、著者らへのインタビュー この中で、今デザインパターンを再編するなら、という話題が出た 補足:15年後のデザインパターン
  17. 53 (記事から抜粋) • Interpreter と Flyweight は、他のパターンとは全く異なる性質を持つ ため、「その他」という別のカテゴリに移動 • Factory

    Method は Factory に一般化 • パターンは「コア」「生成」「周辺」「その他」に分類する ◦ 重要なパターンを強調し、あまり使用されないパターンと区別するた め 補足:15年後のデザインパターン
  18. 54 継続 • Abstract Factory • Builder • Command •

    Composite • Decorator • Facade • Flywight • Interpreter 新旧パターン比較 • Iterator • Mediator • Prototype • Proxy • State • Strategy • Template Method • Visitor 新規 • Dependency Injection • Extension Object • Factory※ • Null Object • Type Object 削除 • Adopter • Bridge • Chain of Responsibility • Factory Method※ • Memento • Observer • Singleton ※Factory MethodはFactoryに一般化
  19. 55 コア • Command • Composite • Facade • Iterator

    • Proxy • Strategy • State • Template Method 新パターン一覧( 21種) 生成 • Builder • Dependency Injection • Factory • Prototype 周辺 • Abstract Factory • Decorator • Extension Object • Mediator • Null Object • Type Object • Visitor その他 • Flyweight • Interpreter
OSZAR »