Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
再利用パターン / Pattern of code reuse
Search
nakaryo
April 19, 2024
Programming
230
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
180
ギフティの技術ブログ 再出発とこれから / restart of giftee tech blog 2024
ryotanakaya
0
400
エンジニアリングエッセイのススメ
ryotanakaya
0
550
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
2
1.8k
エンジニアと要件定義
ryotanakaya
4
1.3k
Go と並行処理
ryotanakaya
0
440
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.7k
増え続けるトランザクションデータと向き合う
ryotanakaya
0
570
Other Decks in Programming
See All in Programming
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
910
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.5k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
140
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
340
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
130
Domain-Driven Transformation
hschwentner
2
2.3k
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
14
6.6k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
Rでドレミ/Do-Re-Mi_with_R
florets1
0
120
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
140
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
The Curious Case for Waylosing
cassininazir
1
550
Technical Leadership for Architectural Decision Making
baasie
3
590
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Building an army of robots
kneath
307
47k
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