リアクティブプログラミング
データの変化を自動的に伝播させ、非同期データストリームを宣言的に処理するパラダイム
プログラミング非同期
リアクティブプログラミングとは
リアクティブプログラミングは、データの変化を自動的に伝播させ、非同期データストリームを宣言的に処理するパラダイムである。RxJS、React の状態管理、Kotlin Flow が代表例。
命令的 vs リアクティブ
// 命令的: 手動でデータの変化を追跡
let a = 1;
let b = 2;
let c = a + b; // 3
a = 10;
// c は 3 のまま (自動更新されない)
// リアクティブ: データの変化が自動伝播
// React の例
const [a, setA] = useState(1);
const [b, setB] = useState(2);
const c = a + b; // a や b が変わると c も自動更新
RxJS の Observable
import { fromEvent, debounceTime, map, switchMap } from 'rxjs';
// 検索ボックスの入力をリアクティブに処理
fromEvent(searchInput, 'input').pipe(
debounceTime(300), // 300ms 待つ
map(e => (e.target as HTMLInputElement).value), // 値を取得
switchMap(query => fetch(`/api/search?q=${query}`)), // API 呼び出し
).subscribe(results => renderResults(results));
// 入力 → デバウンス → API → 表示 が宣言的に記述
React のリアクティブ性
function PriceCalculator() {
const [quantity, setQuantity] = useState(1);
const [unitPrice] = useState(1000);
// quantity が変わると自動的に再計算・再レンダリング
const total = quantity * unitPrice;
const tax = total * 0.1;
return (
<div>
<input type="number" value={quantity} onChange={e => setQuantity(+e.target.value)} />
<p>合計: {total} 円 (税込: {total + tax} 円)</p>
</div>
);
}
リアクティブストリームの操作
| 操作 | 説明 |
|---|---|
| map | 値を変換 |
| filter | 条件に合う値だけ通す |
| debounceTime | 一定時間待ってから最後の値を通す |
| switchMap | 新しいストリームに切り替え |
| merge | 複数のストリームを合流 |
| retry | エラー時にリトライ |
リアクティブ vs コールバック vs async/await
| 方式 | 適用 |
|---|---|
| コールバック | 単発のイベント |
| async/await | 1 回の非同期操作 |
| リアクティブ (Observable) | 連続するデータストリーム |
リアクティブプログラミングの関連書籍も参考になる。