Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Strategyパターン
Search
Hank Ehly
June 29, 2022
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Strategyパターン
https://qiita.com/hankehly
Hank Ehly
June 29, 2022
More Decks by Hank Ehly
See All by Hank Ehly
Fivetranでデータ移動を自動化する
hankehly
0
660
Celeryの紹介と本番運用のTips
hankehly
0
1.7k
ChatGPTを活用した 便利ツールの紹介
hankehly
1
1.4k
Efficient Energy Analytics with Airflow, Spark, and MLFlow
hankehly
0
410
Deferrable Operators入門
hankehly
0
770
【初心者/ハンズオン】Dockerコンテナの基礎知識
hankehly
0
610
Compositeパターン: オブジェクトの階層関係をエレガントに表現する方法
hankehly
0
360
10/29 Airflowの基礎を学ぶハンズオンワークショップ
hankehly
0
320
システム/データ品質保証のための Airflow 活用法
hankehly
0
690
Other Decks in Technology
See All in Technology
Digitization部 紹介資料
sansan33
PRO
2
7.7k
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
2
210
PLATEAU で バーチャル花火大会
tatsuya1970
0
110
20分でわかるセキュアAPI
nwiizo
0
180
MIRU 2026 チュートリアル
keisuke198619
0
860
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
ブラウザ研修 2026
recruitengineers
PRO
4
780
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
6
2.1k
個人OSSが、机の上から世界に広がるまでの話
shinyasaita
1
370
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
620
制約理論(ToC)入門 2026版
recruitengineers
PRO
6
2k
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
150
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
The Pragmatic Product Professional
lauravandoore
37
7.4k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
260
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
460
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
A designer walks into a library…
pauljervisheath
211
24k
Mobile First: as difficult as doing things right
swwweet
225
10k
Building Applications with DynamoDB
mza
96
7.2k
Marketing to machines
jonoalderson
1
5.7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
400
Transcript
Strategyパターン 2022/06/29
自己紹介 • Hank Ehly (ハンク イーリー) • ENECHANGE株式会社 • qiita.com/hankehly
• connpass.com/user/hankehly • github.com/hankehly
アジェンダ • 概要 • いつ使うか • 構造 • コード例
概要 • 交換可能な「アルゴリズム」を作る • Strategyと呼ぶ • Strategyは「複数あるやり方の中の一つのやり方」 • 例)ファイルをアップロードする機能 ◦
S3 ◦ Google Cloud Storage ◦ ローカルファイルシステム Strategy
概要 • コンテキスト(Context)に Strategy を渡す • コンポジション • コンテキストが Strategy
に処理を委託する class Context: def __init__(self, strategy): self.strategy = strategy def operation(self): self.strategy.operation()
概要 • Strategy は、ランタイムで選択できる if url.startswith("s3://"): context = Context(strategy=S3()) elif
url.startswith("gs://"): context = Context(strategy=GoogleCloudStorage()) else: context = Context(strategy=LocalStorage()) • Contextの中身を修正せずに振る舞いを変えている • Contextを「拡張」している ◦ テスト修正 / デグレ確認が減る
いつ使うか 1. 関連しているアルゴリズムの「やること」が同じで「やり方」だけ違う Random Forest と Deep Learning 2. ディスク容量、実行時間、ネットワーク速度などの考慮
ネットワークが遅い時は、画像の画質を多少落として送信する 3. メソッドの振る舞いを if/else で分岐して実装している時 いくつかの「Strategy」に分ける
構造 • Strategy ◦ 共通のインターフェイス
構造 • Strategy ◦ 共通のインターフェイス • ConcreteStrategy ◦ Strategyの実装
構造 • Strategy ◦ 共通のインターフェイス • ConcreteStrategy ◦ Strategyの実装 •
Context ◦ Strategyを持つ/使用する
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") コード例
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") コード例
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") コード例
コード例 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")
Qiita ENECHANGE株式会社 ご清聴ありがとうございます