Slide 8
Slide 8 text
案1: Repository パターン with インターフェース(推奨)
// user_repository.go
type UserRepository interface {
GetAllUsers(ctx context.Context) ([]slack.User, error)
FindByDisplayName(ctx context.Context, displayName string) ([]slack.User, error)
}
type userRepository struct {
client *slack.Client
cache []slack.User
cacheExpiry time.Time
cacheTTL time.Duration
mu sync.RWMutex
}
メリット: テスタブル、責務が明確、キャッシュロジックを隠蔽
デメリット: 初期実装にはやや大げさかも
案2: シンプルな構造体直接実装
type UserCache struct {
client *slack.Client
users []slack.User
expiry time.Time
}
メリット: シンプル、実装が速い
デメリット: テストしづらい、拡張性が低い
案3: Handler内に直接実装
メリット: ファイル数が増えない
デメリット: Handlerが肥大化、責務が不明確、テストしづらい
推奨案の詳細設計
案1のRepository パターンを推奨するよ!理由:
- users.listの結果をキャッシュして効率化できる
- 将来のreal_name検索追加が容易
- Handlerから Slack API の詳細を隠蔽できる
- モックを使ったテストが書きやすい
// 15分程度のTTLでキャッシュ
// users.listは全ユーザー取得なのでAPIコール削減効果が高い
// ページネーション対応(大規模ワークスペース用)
この設計が破綻するケース:
- リアルタイムでのユーザー情報更新が必須になった場合
- メモリ使用量が問題になるほど大規模なワークスペース(数万ユーザー)
どう思う?😊