Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Feature Toggle は捨てやすく使おう

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for gennei gennei
March 22, 2026

Feature Toggle は捨てやすく使おう

Avatar for gennei

gennei

March 22, 2026

More Decks by gennei

Other Decks in Programming

Transcript

  1. よくある例 class HomeController { public function index(): Response { $user

    = auth()->user(); if (FeatureToggle::enabled('new_recommendation')) { // 新ロジック: パーソナライズしたおすすめのロジック $books = $this->recommendationService->getBooks($user); } else { // 旧ロジック:最近追加した本をおすすめとして出す $books = $this->latestBookService->getBooks($user); } return view('home.index', ['recommendedBooks' => $books]); } } 8
  2. トグルを削除すると - if (FeatureToggle::enabled('new_recommendation')) { - // 新ロジック: パーソナライズしたおすすめのロジック -

    $books = $this->recommendationService->getBooks($user); - } else { - // 旧ロジック:最近追加した本をおすすめとして出す - $books = $this->latestBookService->getBooks($user); - } + $books = $this->recommendationService->getBooks($user); 9
  3. 改善案1: private method に切り出して 早期 return する public function index():

    Response { $books = $this->getBooks(auth()->user()); return view('home.index', ['recommendedBooks' => $books]); } private function getBooks($user): array { if (FeatureToggle::disabled('new_recommendation')) { return $this->latestBookService->findRecentlyAdded($user); } return $this->recommendationService->recommendByPersonalizedLogic($user); } 11
  4. 実装したものを用意 旧 class RecentBooksRecommendationEngine implements RecommendationEngine { public function recommendFor(User

    $user, int $limit = 20): array { // とりあえず「最近追加された本」をおすすめとして扱う $books = []; return $books; } } 14
  5. 新 class PersonalizedRecommendationEngine implements RecommendationEngine { public function recommendFor(User $user,

    int $limit = 20): array { // 新ロジック本体を書く $books = []; return $books; } } 15
  6. 改善されたコード class HomeController { public function __construct( private readonly RecommendationEngine

    $recommendationEngine, ) {} public function index(): Response { $user = auth()->user(); $books = $this->recommendationEngine->recommendFor($user, 20); return view('home.index', ['recommendedBooks' => $books]); } } 16
  7. トグルはDI に使う class RecommendationServiceProvider extends ServiceProvider { public function register():

    void { $this->app->bind(RecommendationEngine::class, function ($app) { if (FeatureToggle::disabled('new_recommendation')) { return $app->make(RecentBooksRecommendationEngine::class); } return $app->make(PersonalizedRecommendationEngine::class); }); } } 18