プロセス指向(Process-Oriented Programming, P.O.P.)
うの,•5 min read
プロセス指向(Process-Oriented Programming, P.O.P.)
「プロセス指向(Process-Oriented Programming, P.O.P.)」は、
「プロセス(処理の流れ)」を最上位概念とし、データは単なる情報として扱うプログラミングパラダイム です。
従来のオブジェクト指向(OOP)と比較して、
より柔軟で拡張しやすく、パフォーマンスも最適化できる設計手法 を提供します。
🔹 プロセス指向の3つの原則
-
1 プロセス(処理の流れ)が最上位の概念
- データ(オブジェクト)よりも、処理の流れを重視する。
- オブジェクトはデータ構造としてのみ存在し、ロジックを持たない。
- システムは、プロセス(処理単位)の集合として設計される。
-
2 プロセスは戦略パターンとして定義し、プロセッサーから実行する
- すべてのプロセス(処理単位)は戦略パターンとして実装される。
- プロセッサーは「どのプロセスを使うか?」を決定し、実際の処理には関与しない。
- プロセスは
type
+ 関数で定義し、クラスのオーバーヘッドを排除する。
-
3 プロセッサーは「プロセスの管理者」として動作する
- プロセス(戦略)を選択し、実行する責務を持つ。
- プロセッサーの中で他のプロセッサーを利用できる(ネスト可能)。
- 状態を持つプロセッサーは「短期間の状態」のみを管理し、永続データはDBなどに委ねる。
🔹 設計パターン
プロセス指向では、以下の要素を明確に分けて実装する。
要素 | 役割 | 実装方法 |
---|---|---|
プロセス(Process) | 状態を持たない処理の単位 | type + 関数 |
プロセッサー(Processor) | プロセスを統括し、戦略を選択する | クラス |
データ(Data) | シンプルなデータ構造(オブジェクト) | type + クリエイター関数 |
🔹 最終的な実装例
1 プロセス(戦略パターン)
// 決済戦略の型定義
type PaymentStrategy = {
processPayment: (amount: number) => boolean;
};
// クレジットカード決済の戦略
const creditCardPayment: PaymentStrategy = {
processPayment: (amount) => {
console.log(`Processing credit card payment of $${amount}`);
return true;
},
};
// PayPal決済の戦略
const payPalPayment: PaymentStrategy = {
processPayment: (amount) => {
console.log(`Processing PayPal payment of $${amount}`);
return true;
},
};
- 戦略は
type
+ 関数で定義し、クラスのオーバーヘッドを削減。 - 新しい決済方法を追加しても、プロセッサーを変更せずに済む。
2 プロセッサー
// 状態を持つプロセッサー(決済処理の管理)
class PaymentProcessor {
constructor(private paymentStrategy: PaymentStrategy) {}
setPaymentStrategy(strategy: PaymentStrategy) {
this.paymentStrategy = strategy;
}
process(amount: number): boolean {
return this.paymentStrategy.processPayment(amount);
}
}
- プロセッサーは「プロセスの管理者」として戦略を選択する。
- 戦略を動的に変更可能(
setPaymentStrategy()
を利用)。
3 プロセッサーの中で他のプロセッサーを使用する(ネスト)
// 状態を持つプロセッサー(注文処理の統括)
class OrderProcessor {
constructor(private paymentProcessor: PaymentProcessor) {}
processOrder(user: string, total: number): boolean {
console.log(`Processing order for ${user}...`);
return this.paymentProcessor.process(total);
}
}
// === 使用例 ===
const paymentProcessor = new PaymentProcessor(creditCardPayment);
const orderProcessor = new OrderProcessor(paymentProcessor);
console.log("Using Credit Card:");
orderProcessor.processOrder("Alice", 100);
// 戦略を切り替え
console.log("\nSwitching to PayPal:");
paymentProcessor.setPaymentStrategy(payPalPayment);
orderProcessor.processOrder("Bob", 200);
- プロセッサーが別のプロセッサーを利用することで、システム全体の流れを整理できる。
- 動的に処理を切り替えながら、依存関係をシンプルに保つ。
🔹 プロセス指向 vs オブジェクト指向
特徴 | オブジェクト指向(OOP) | プロセス指向(P.O.P.) |
---|---|---|
最上位概念 | オブジェクト(データ+振る舞い) | プロセス(処理の流れ) |
状態管理 | オブジェクトごとに状態を持つ | 状態を持つプロセッサーと持たないプロセスを分離 |
ロジックの分離 | オブジェクトがロジックを持つ | プロセス(関数)として分離 |
オブジェクトの役割 | データ+ロジックのカプセル化 | データ構造としてのみに限定 |
テスト容易性 | モックが必要 | 純粋関数が多く、テストしやすい |
拡張性 | 継承やポリモーフィズムを活用 | 関数の合成やプロセスの組み合わせで拡張 |
🔹 結論:「プロセス指向」まとめ
- プロセス(処理の流れ)を最上位にすることで、システムの設計を整理できる。
- 戦略パターンを使って、プロセスを柔軟に変更できる。
- プロセッサーは「プロセスの調整役」に徹し、処理ロジックを持たない。
- オブジェクト(データ構造)は
type
で定義し、クラスのオーバーヘッドを削減する。