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

Feature Toggle は捨てやすく使おう

Avatar for gennei gennei
March 22, 2026

Feature Toggle は捨てやすく使おう

Avatar for gennei

gennei

March 22, 2026
Tweet

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