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

Strategyパターン

 Strategyパターン

65389cd2b6fdc531dcc4af999e864593?s=128

Hank Ehly

June 29, 2022
Tweet

More Decks by Hank Ehly

Other Decks in Technology

Transcript

  1. Strategyパターン 2022/06/29

  2. 自己紹介 • Hank Ehly (ハンク イーリー) • ENECHANGE株式会社 • qiita.com/hankehly

    • connpass.com/user/hankehly • github.com/hankehly
  3. アジェンダ • 概要 • いつ使うか • 構造 • コード例

  4. 概要 • 交換可能な「アルゴリズム」を作る • Strategyと呼ぶ • Strategyは「複数あるやり方の中の一つのやり方」 • 例)ファイルをアップロードする機能 ◦

    S3 ◦ Google Cloud Storage ◦ ローカルファイルシステム Strategy
  5. 概要 • コンテキスト(Context)に Strategy を渡す • コンポジション • コンテキストが Strategy

    に処理を委託する class Context: def __init__(self, strategy): self.strategy = strategy def operation(self): self.strategy.operation()
  6. 概要 • Strategy は、ランタイムで選択できる if url.startswith("s3://"): context = Context(strategy=S3()) elif

    url.startswith("gs://"): context = Context(strategy=GoogleCloudStorage()) else: context = Context(strategy=LocalStorage()) • Contextの中身を修正せずに振る舞いを変えている • Contextを「拡張」している ◦ テスト修正 / デグレ確認が減る
  7. いつ使うか 1. 関連しているアルゴリズムの「やること」が同じで「やり方」だけ違う Random Forest と Deep Learning 2. ディスク容量、実行時間、ネットワーク速度などの考慮

    ネットワークが遅い時は、画像の画質を多少落として送信する 3. メソッドの振る舞いを if/else で分岐して実装している時 いくつかの「Strategy」に分ける
  8. 構造 • Strategy ◦ 共通のインターフェイス

  9. 構造 • Strategy ◦ 共通のインターフェイス • ConcreteStrategy ◦ Strategyの実装

  10. 構造 • Strategy ◦ 共通のインターフェイス • ConcreteStrategy ◦ Strategyの実装 •

    Context ◦ Strategyを持つ/使用する
  11. class Storage: def upload(self, data, path): pass class S3(Storage): def

    upload(self, data, path): print("S3の {path} に {data} をアップロードする ") class Context: def __init__(self, storage: Storage): self.storage = storage def upload(self, data, path): self.storage.upload(data, path) context = Context(storage=S3()) context.upload(b"hello world", "s3://bucket/file.csv") コード例
  12. class Storage: def upload(self, data, path): pass class S3(Storage): def

    upload(self, data, path): print("S3の {path} に {data} をアップロードする ") class Context: def __init__(self, storage: Storage): self.storage = storage def upload(self, data, path): self.storage.upload(data, path) context = Context(storage=S3()) context.upload(b"hello world", "s3://bucket/file.csv") コード例
  13. class Storage: def upload(self, data, path): pass class S3(Storage): def

    upload(self, data, path): print("S3の {path} に {data} をアップロードする ") class Context: def __init__(self, storage: Storage): self.storage = storage def upload(self, data, path): self.storage.upload(data, path) context = Context(storage=S3()) context.upload(b"hello world", "s3://bucket/file.csv") コード例
  14. コード例 class Storage: def upload(self, data, path): pass class S3(Storage):

    def upload(self, data, path): print("S3の {path} に {data} をアップロードする") class Context: def __init__(self, storage: Storage): self.storage = storage def upload(self, data, path): self.storage.upload(data, path) context = Context(storage=S3()) context.upload(b"hello world", "s3://bucket/file.csv")
  15. Qiita ENECHANGE株式会社 ご清聴ありがとうございます