LogoSkills

Pattern Selection Guide

A decision guide for selecting optimal patterns based on the situation.

Reference location: .claude/references/DECISION_MATRIX.md

A decision guide for selecting optimal patterns based on the situation.


UseCase Patterns#

✅ Standard: Optional Constructor Injection (Pure DI)

UseCase ė‚ŽėšĐ? ─Yes→ Optional Constructor Injection
             └No→ Repository 링렑 ė ‘ę·ž ęļˆė§€ (UseCase í†ĩí•īė„œë§Œ!)

Pattern#

CriteriaOptional Constructor Injection
Recommended✅ Standard pattern
DI SetupgetIt/injectable not needed
TestingBloc(useCase: mockUseCase) direct injection

Key Points:

  • UseCase: const UseCase([IRepo? repo]) : _repo = repo ?? ConcreteRepo()
  • BLoC: Bloc({UseCase? useCase}) : _useCase = useCase ?? const UseCase()
  • Test: Bloc(useCase: mockUseCase) - getIt.reset() Not needed

-> Details: patterns/usecase-patterns.md


BLoC State Pattern Selection#

Clear state separation? ─Yes─▹ Freezed Union (ęķŒėžĨ)
               │
               └No─▹ Avoid code generation? ─Yes─▹ Sealed Class
                                   │
                                   └No─▹ Single State

Detailed Comparison#

CriteriaFreezed UnionSealed ClassSingle State
Code GenerationRequiredNot neededRequired
State Separation✅ Clear✅ Clear⚠ïļ Less clear
copyWith✅ Auto⚠ïļ Manual✅ Auto
Pattern Matching ✅ when/map ✅ switch ⚠ïļ Conditionals
Recommended For General use Dart 3.0+, avoiding codegen Pagination, filtering

Selection Criteria:

  • ✅ Freezed Union: Clear Initial/Loading/Loaded/Error separation
  • ✅ Sealed Class: Type-safe without code generation
  • ✅ Single State: Multiple state combinations (isLoading + items + hasMore)

-> Details: patterns/bloc-patterns.md


Repository Implementation Pattern Selection#

Need network logic reuse? ─Yes─▹ Mixin íŒĻí„ī (ęķŒėžĨ)
                         │
                         └No─▹ Multiple data source combination? ─Yes─▹ Mixin íŒĻí„ī
                                                     │
                                                     └No─▹ Direct implementation

Detailed Comparison#

CriteriaMixin PatternDirect implementation
Logic Reuse✅ Easy⚠ïļ Difficult
Structural Complexity⚠ïļ Increased✅ Simple
Testing✅ Independent Mixin tests⚠ïļ Full tests
Recommended For Complex APIs, multiple data sources Simple CRUD

Selection Criteria:

  • ✅ Mixin Pattern: API logic reuse, caching layer separation, complex data processing
  • ✅ Direct Implementation: Simple CRUD, quick implementation, no reuse needed

-> Details: patterns/repository-patterns.md


Caching Strategy Selection#

Data changes frequently? ─Yes─▹ SWR (Stale-While-Revalidate)
                 │
                 └No─▹ Need offline? ─Yes─▹ Cache-First
                                      │
                                      └No─▹ SWR

Detailed Comparison#

CriteriaSWRCache-First
Response Speed ✅ Instant (cache) + refresh ✅ Instant (cache)
Network Usage⚠ïļ Called every time✅ Skipped when cached
Data Freshness✅ Latest⚠ïļ Until cache expires
Offline Support⚠ïļ Only when cached✅ Cache first

Suitable cases:

SWRCache-First
Feed, timelineUser profile
Chat messagesApp settings
Notification ListCategory List
Real-time statusStatic content

-> Details: patterns/caching-patterns.md


Entity Definition Pattern Selection#

Code generation available? ─Yes─▹ Freezed (ęķŒėžĨ)
              │
              └No─▹ Dart 3.0+? ─Yes─▹ Final Class
                              │
                              └No─▹ ėžë°˜ Class

Detailed Comparison#

CriteriaFreezedFinal Classėžë°˜ Class
copyWith✅ Auto⚠ïļ Manual⚠ïļ Manual
equality✅ Auto⚠ïļ Manual⚠ïļ Manual
Immutability ✅ Enforced ✅ final Enforced ⚠ïļ Selection
JSON serialization✅ Auto⚠ïļ Manual⚠ïļ Manual

UI Component Selection#

Existing component available? ─Yes─▹ /coui:improve (Improvement)
                   │
                   └No─▹ Form component? ─Yes─▹ /coui:form
                                      │
                                      └No─▹ Full screen? ─Yes─▹ /coui:screen
                                                        │
                                                        └No─▹ /coui:component

Test Strategy Selection#

E2E test? ─Yes─▹ /bdd:generate (BDD ė‹œë‚˜ëĶŽė˜Ī)
           │
           └No─▹ BLoC test? ─Yes─▹ bloc_test íŒĻí‚Īė§€
                              │
                              └No─▹ Unit test? ─Yes─▹ mocktail + flutter_test

Agent Selection Guide#

Feature Development#

ScenarioInvocationDescription
Full Feature creation /feature:create Domain + Data + Presentation
Domain only /feature:domain Entity, UseCase, Repository Interface
Data only/feature:dataRepository impl, Cache, DAO
Presentation only/feature:presentationBLoC, Page, Widget
BLoC only/feature:blocState management only

Backend Development#

ScenarioInvocationDescription
New model definition/serverpod:model.spy.yaml file creation
Endpoint creation/serverpod:endpointAPI endpoints

UI Development#

ScenarioInvocationDescription
Single component/coui:componentButtons, cards, etc.
Form creation/coui:formComplete input form
Full screen/coui:screenPage composition
Existing UI improvement /coui:improve Refactoring, style improvement

Quick Reference Checklist#

When Starting a New Feature#

  • /serverpod:model - Backend model definition
  • /serverpod:endpoint - API endpoints
  • /feature:domain - Entity, UseCase Definition
  • /feature:data - Repository Implementation
  • /feature:presentation - BLoC, UI Implementation
  • /bdd:generate - Test scenarios

When Selecting Patterns#

  • UseCase → patterns/usecase-patterns.md
  • BLoC State → patterns/bloc-patterns.md
  • Repository → patterns/repository-patterns.md
  • Caching → patterns/caching-patterns.md

When Checking Workflow#

  • Feature Generation → DEPENDENCY_GRAPH.md
  • Parallel Execution → DEPENDENCY_GRAPH.md#parallel-execution-available-work

Referencing Agents#

  • All /feature:* Agents
  • /serverpod:* Agents
  • /coui:* Agents