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
140
ギフティの技術ブログ 再出発とこれから / restart of giftee tech blog 2024
ryotanakaya
0
360
エンジニアリングエッセイのススメ
ryotanakaya
0
520
ソフトウェアアーキテクチャについて 語るときに 僕の語ること
ryotanakaya
2
1.7k
エンジニアと要件定義
ryotanakaya
4
1.2k
Go と並行処理
ryotanakaya
0
420
ワクワク!Rubyクイズ!!
ryotanakaya
0
1.6k
増え続けるトランザクションデータと向き合う
ryotanakaya
0
550
Other Decks in Programming
See All in Programming
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
100
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
どこまでゆるくて許されるのか
tk3fftk
0
470
1B+ /day規模のログを管理する技術
broadleaf
0
130
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
120
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.3k
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.4k
OS アップデート対応の取り組み方がもっと共有されてほしい
andpad
0
110
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
160
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
Embracing the Ebb and Flow
colly
88
5.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
Designing for humans not robots
tammielis
254
26k
How to build a perfect <img>
jonoalderson
1
5.8k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Are puppies a ranking factor?
jonoalderson
1
3.7k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
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