Slide 1

Slide 1 text

Strategyパターン 2022/06/29

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

アジェンダ ● 概要 ● いつ使うか ● 構造 ● コード例

Slide 4

Slide 4 text

概要 ● 交換可能な「アルゴリズム」を作る ● Strategyと呼ぶ ● Strategyは「複数あるやり方の中の一つのやり方」 ● 例)ファイルをアップロードする機能 ○ S3 ○ Google Cloud Storage ○ ローカルファイルシステム Strategy

Slide 5

Slide 5 text

概要 ● コンテキスト(Context)に Strategy を渡す ● コンポジション ● コンテキストが Strategy に処理を委託する class Context: def __init__(self, strategy): self.strategy = strategy def operation(self): self.strategy.operation()

Slide 6

Slide 6 text

概要 ● Strategy は、ランタイムで選択できる if url.startswith("s3://"): context = Context(strategy=S3()) elif url.startswith("gs://"): context = Context(strategy=GoogleCloudStorage()) else: context = Context(strategy=LocalStorage()) ● Contextの中身を修正せずに振る舞いを変えている ● Contextを「拡張」している ○ テスト修正 / デグレ確認が減る

Slide 7

Slide 7 text

いつ使うか 1. 関連しているアルゴリズムの「やること」が同じで「やり方」だけ違う Random Forest と Deep Learning 2. ディスク容量、実行時間、ネットワーク速度などの考慮 ネットワークが遅い時は、画像の画質を多少落として送信する 3. メソッドの振る舞いを if/else で分岐して実装している時 いくつかの「Strategy」に分ける

Slide 8

Slide 8 text

構造 ● Strategy ○ 共通のインターフェイス

Slide 9

Slide 9 text

構造 ● Strategy ○ 共通のインターフェイス ● ConcreteStrategy ○ Strategyの実装

Slide 10

Slide 10 text

構造 ● Strategy ○ 共通のインターフェイス ● ConcreteStrategy ○ Strategyの実装 ● Context ○ Strategyを持つ/使用する

Slide 11

Slide 11 text

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") コード例

Slide 12

Slide 12 text

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") コード例

Slide 13

Slide 13 text

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") コード例

Slide 14

Slide 14 text

コード例 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")

Slide 15

Slide 15 text

Qiita ENECHANGE株式会社 ご清聴ありがとうございます