Skip to content

アンチパターン回避チェックリスト

このチェックリストを使って、自分のRxJSコードがアンチパターンに該当していないか確認しましょう。各項目をクリックすると、詳しい解説とコード例を確認できます。

チェック項目

🔴 重大な問題の回避

チェック項目ポイント
Subject は asObservable() で公開Subject を直接 export せず、asObservable() で Observable として公開
状態変更は専用メソッド経由でのみ可能にする
ネストした subscribe を避けるsubscribe 内で別の subscribe を呼ばない
switchMapmergeMapconcatMap などでフラット化
無限ストリームは必ず解除イベントリスナーなど無限に続くストリームは必ず購読解除
takeUntil パターンまたは Subscription の管理
shareReplay の設定を明示shareReplay({ bufferSize: 1, refCount: true }) の形式を使用
メモリリークを防ぐために参照カウントを有効化
subscribe内のif文ネストを避けるsubscribe 内での複雑な条件分岐(3つ以上のネスト)を避ける
filteriifpartitionなどのオペレーターで宣言的に記述

🟡 注意が必要な問題の回避

チェック項目ポイント
map は純粋関数、副作用は tapmap 内で状態変更やログ出力をしない
副作用は tap オペレーターで明示的に分離
Cold/Hot を適切に使い分けHTTP リクエストなどは shareReplay で Hot に変換
購読ごとに実行されるべきか、共有すべきかを判断
Promise は from で変換Promise と Observable を混在させない
from() で Observable に変換して統一的に処理
高頻度イベントは制御検索入力は debounceTime、スクロールは throttleTime で制御
distinctUntilChanged で重複を除外

🔵 コード品質の向上

チェック項目ポイント
エラーを適切に処理catchError でエラーをキャッチし、適切に処理
ユーザーに分かりやすいエラーメッセージを表示
必要に応じて retry / retryWhen で再試行
DOM イベントを適切に解放fromEvent の購読は必ず解除
コンポーネント破棄時に takeUntil で自動解除
型安全性を確保インターフェースや型エイリアスを定義
Observable<T> の型パラメータを明示
TypeScript の型推論を活用
適切なオペレーターを選択検索: switchMap、並列: mergeMap
順次: concatMap、連打防止: exhaustMap
シンプルな処理は RxJS 不要配列処理などは通常の JavaScript で十分
RxJS は非同期処理やイベントストリームに使用
状態はリアクティブに管理BehaviorSubjectscan で状態を管理
subscribe は最終的なトリガーとして使用
テストを書くTestScheduler でマーブルテストを実施
非同期処理を同期的にテスト可能に

使い方

1. コードレビュー時

新しいコードを書いた後、このチェックリストを使って自己レビューを実施しましょう。

2. プルリクエスト時

プルリクエストのテンプレートにこのチェックリストを含めることで、レビュアーと共通の基準で確認できます。

3. 定期的な見直し

既存のコードベースに対して定期的にこのチェックリストを使い、アンチパターンが混入していないか確認しましょう。

4. チーム内での共有

チームメンバーと共有し、RxJS のベストプラクティスを統一しましょう。

関連リソース

チェックリスト活用のコツ

  1. 全項目を一度に完璧にしようとしない

    • まずは重大な問題(🔴)から優先的に対処
    • 段階的に改善していく
  2. チーム内で優先度を決める

    • プロジェクトの特性に応じて重要度を調整
    • カスタマイズしたチェックリストを作成
  3. 自動化を検討

    • ESLint などの静的解析ツールで自動チェック
    • CI/CD パイプラインに組み込む
  4. 定期的に更新

    • RxJS のバージョンアップに応じて更新
    • チームの経験から得た知見を反映

重要: このチェックリストは完璧なコードを書くためのものではなく、よくある問題を避けるためのガイドです。プロジェクトの文脈に応じて柔軟に活用してください。

Released under the CC-BY-4.0 license.