Skip to content
Naoya Tech
Go back

What Is Dependency Injection? Building It Up Step by Step

14:58 Programming & CS

Overview

Dependency injection sounds complicated, but the idea is simple: instead of creating the code it depends on, a piece of code receives it from outside. This video builds the attachment service of a business chat app from scratch to show what that gives you, and where it goes too far.

Key Points

Chapters

概要

依存性の注入(DI)は難しそうな名前ですが、中身はシンプルです。あるコードが使う別のコードを内部で作る代わりに、外から渡してもらう。それだけです。この動画では、ビジネスチャットアプリの添付ファイルを扱うサービスをゼロから組み立てながら、DIで何が得られるのか、そしてどこからがやりすぎなのかを解説します。

ポイント

  • 保存先としてS3、SFTP、WebDAVをif文で切り替えると、1つのクラスが責任を抱えすぎ、メソッドは任意の引数だらけになり、接続情報を何層にもわたってバケツリレーすることになります。
  • DIでは、ストレージのインターフェースに対して保存先ごとの実装を用意し、それぞれの接続設定はコンストラクターで受け取ります。ユーザーの所属する会社が分かった時点でファクトリーが適切なストレージを作り、リクエスト処理はアップロードを呼ぶだけになります。
  • 同じ考え方で、ウイルススキャン(本番はスレットプロテクト、開発環境はシナジー)、sharpライブラリーによる画像の縮小、MIMEタイプに応じたプレビュー生成、ユーザーごとの鍵を使ったAES暗号化という一連の処理も組み立てます。構成はすべて1か所で決まり、起動時に決まるものとリクエストごとに選ばれるものがあります。
  • 部品同士がインターフェース越しにつながっているので、テストではローカルで動く偽物のS3や何もしない暗号化を差し込み、一部分だけを隔離して検証できます。偽物を使えば、失敗のケースも簡単に再現できます。
  • 現場のエンジニアからは、引数の多すぎる関数、定義へジャンプするとインターフェースに飛んでしまうこと、早すぎる抽象化といった批判も挙がっています。差し込み口を作る目安は、分岐が3つ以上になったとき、テストのためにその依存を用意するのが面倒なとき、たまにしか使わない部品が起動を重くしているときの3つです。まずは素直に作り、つらくなった部分だけを切り出します。

チャプター

Watch on YouTube

Share this post on:

Previous Video
How Processes and Threads Work
Next Video
Automating an OSS Vulnerability Feed with Notion Workers