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
nakaryo
April 19, 2024
Programming
210
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.1k
Ruby で gRPC を使おう / ruby-grpc
ryotanakaya
1
150
ギフティの技術ブログ 再出発とこれから / restart of giftee tech blog 2024
ryotanakaya
0
370
エンジニアリングエッセイのススメ
ryotanakaya
0
530
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
2
1.7k
エンジニアと要件定義
ryotanakaya
4
1.2k
Go と並行処理
ryotanakaya
0
430
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.7k
増え続けるトランザクションデータと向き合う
ryotanakaya
0
550
Other Decks in Programming
See All in Programming
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
410
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
290
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
120
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.9k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
230
今さら聞けない .NET CLI
htkym
0
180
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
Featured
See All Featured
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Producing Creativity
orderedlist
PRO
348
40k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
480
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
210
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
650
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
980
Fireside Chat
paigeccino
42
4k
A designer walks into a library…
pauljervisheath
211
24k
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