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
再利用パターン / Pattern of code reuse
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
nakaryo
April 19, 2024
Programming
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
再利用パターン / Pattern of code reuse
nakaryo
April 19, 2024
More Decks by nakaryo
See All by nakaryo
エラー処理の温故知新 / history of error handling technic
ryotanakaya
7
2.2k
Ruby で gRPC を使おう / ruby-grpc
ryotanakaya
1
170
ギフティの技術ブログ 再出発とこれから / restart of giftee tech blog 2024
ryotanakaya
0
380
エンジニアリングエッセイのススメ
ryotanakaya
0
540
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
2
1.8k
エンジニアと要件定義
ryotanakaya
4
1.3k
Go と並行処理
ryotanakaya
0
430
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.7k
増え続けるトランザクションデータと向き合う
ryotanakaya
0
550
Other Decks in Programming
See All in Programming
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
360
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
440
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
210
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
400
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
180
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
240
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
150
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
1.2k
Android CLI
fornewid
0
240
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
280
Designing for Performance
lara
611
70k
How to train your dragon (web standard)
notwaldorf
97
6.8k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
30 Presentation Tips
portentint
PRO
1
380
YesSQL, Process and Tooling at Scale
rocio
174
15k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
480
Navigating Weather and Climate Data
rabernat
0
490
Transcript
2024/04/19 Nakaya Ryota 再利用パターン
ギフティ入社:2019年1月 所属:技術本部 Distribution Section GiftExperience dev Unit 前職:バックオフィス系システムのパッケージベンダー(上流メイン)
言語:Go、Ruby、Java 分報:#times_nakaya 好きな4文字熟語:不労所得 自己紹介
みなさん、ダブルメンテって嫌いですよね (僕は嫌いです)
重複しているものを見ると共通化したくなりますよね DRY(Don't Repeat Yourself) 原則、口を酸っぱくして指摘され ますよね
共通化はエンジニアの性 ソフトウェアの利点は、再利用可能であること
コードを再利用するときに どういう手法があるんだろう?
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
• 共通の処理を関数(サブルーチン)に切り出す 関数に切り出す def hoge ... taxed_item_price = item_price *
1.1 ... end def fuga ... taxed_item_price = item_price * 1.1 ... end
• 共通の処理を関数(サブルーチン)に切り出す 関数に切り出す def hoge ... taxed_item_price = item_price *
1.1 ... end def fuga ... taxed_item_price = item_price * 1.1 ... end def hoge ... taxed_item_price = taxed_item_price(item_price) ... end def fuga ... taxed_item_price = taxed_item_price(item_price) ... end def taxed_item_price(item_price) item_price * 1.1 end 消費税計算を行う処理を関数化して再利用→
• 関数化以外にも変数化、定数化、クラス化など言語によって様々な方法で共通化ができる • それらを高度に組み合わせて形式化した、デザインパターンなどもある • ただし、再利用できる範囲は同一コードベース内に限られる 関数に切り出す
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
• コードをとある単位でパッケージングしてインポート可能にする • Ruby なら gem、Node.js なら module など ライブラリ化
• 複数のコードベースを跨いだ共通化が可能 • ライブラリの粒度や依存関係の管理が大変 ◦ 粒度が粗いと、使用していない機能の変更でもバージョンアップする必要が出てきうる ◦ 粒度が小さいと、ライブラリ間の依存関係が増え、管理が煩雑になる • 言語の縛りがある
◦ Ruby の gem は Ruby でしか使えない ◦ 少なくともインポートする側の処理系が扱えるものでないとダメ • 処理がコードに閉じない場合(永続化処理があるなど)は、使い所が難しい ◦ 誰がテーブルスキーマを管理するのかなど、考えることが増える ライブラリ化
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
• 共通機能を全く別のサービスとして管理する • なんらかの通信プロトコル、フォーマットを使用してデータをやり取りする ◦ Web なら HTTP や WebSocket
など ◦ フォーマット ▪ JSON、XML など ◦ プログラミング言語に依存しない 共有サービス
• インターフェースだけを共有し、内部実装には依存しないのでより疎結合になる ◦ サービス側は IF を守っていれば自由に更新できる • プログラミング言語の縛りがない • 性能、スケーラビリティ、耐障害性など運用特性上のリスクが出てくる
◦ 協調スケーリングが必要 ◦ リモート呼び出しのため、ネットワークレイテンシがある ◦ 共有サービスが SPOF になる • 共有サービスの更新で、全ての依存サービスが壊れるリスクがある 共有サービス
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
サイドカーコンテナ • コンテナ限定のパターン • マイクロサービスの文脈でよく出てくる ◦ サービスメッシュとか ◦ ロギング、モニタリング、プロトコル変換など全てのアプリが必要とする共通処理を行う •
アプリケーションコンテナの横に、共通処理を担うコンテナを横付けするようにホストする • サイドカーのコンテナイメージ自体は共通でメンテされる
サイドカーコンテナ • プログラミング言語の縛りがない • マシンリソースの割り当てがコントロールできる • サイドカーコンテナを立てて運用するためのテクノロジーが必要 • サービスごとにサイドカーを立てるのが非効率的なので最近はアンビエントメッシュという手法 も出てきている
• 再利用パターン ◦ 関数に切り出す ◦ ライブラリ化 ◦ 共有サービス ◦ サイドカーコンテナ
• 共通化の罠 Agenda
• ゴッドクラス、ゴッドサービスに気をつける • コードを共通化すると、それを使うコード側に依存関係が発生する • 利用箇所が増えれば増えるほど、共有コードの変更による影響範囲が増える • どこでも使うからと、一つのクラスや一つのサービスにロジックを集中させ、全員がそこに依存 すると、それの変更時に全てが壊れる可能性がある •
適度な抽象化と凝集化と変化率が重要 ◦ 全再利用の原則 ◦ 閉鎖性共通の原則 ◦ 単一責任の原則 ◦ 安定度・抽象度等価の原則 共通化の罠
• その処理が呼ばれる際のコンテキストが重要 ◦ システム内に同様の処理を行う部分が複数あったとしても、それぞれが使われるコンテキストが別なら共通化 しない方が良い ◦ たまたま一時的に同じ(共通化できる)状態になっているだけの可能性がある • 変更の文脈それ自体はコードでは表現されない ◦
文脈を加味した設計力が求められる ◦ 再利用は基本的に良いことだが、システム全体の構造がわかるまでは共有は慎重に行う 共通化の罠
fin