command-pattern
タスクの実行と呼び出しを分離するコマンドパターンを解説します。アンドゥ・リドゥ機能や操作のキューイングが必要な場合、または操作を呼び出すオブジェクトと実行するオブジェクトを疎結合にしたい場合に活用してください。
description の原文を見る
Teaches the command pattern for decoupling task execution from invocation. Use when you need undo/redo functionality, queued operations, or want to decouple the object that invokes an operation from the one that performs it.
SKILL.md 本文
コマンドパターン
コマンドパターンを使用することで、特定のタスクを実行するオブジェクトと、メソッドを呼び出すオブジェクトを_分離_できます。
オンライン食品配送プラットフォームがあるとしましょう。ユーザーは注文の配置、追跡、キャンセルができます。
使用する場合
- 操作を呼び出すオブジェクトと実行するオブジェクトを分離する必要がある場合に使用します
- コマンドが特定のライフサイクルを持つ必要があったり、キューに入れられて特定の時間に実行される場合に有効です
使用しない場合
- アンドゥ/リドゥ、キューイング、ログが不要なシンプルな一度きりの操作
- 直接関数呼び出しで十分に明確で、追加の抽象化が複雑さを増すだけの場合
- システムの操作が少なく、コマンドインフラストラクチャがオーバーエンジニアリングになる場合
手順
executeメソッドを含むCommandクラスを作成し、アクションをカプセル化します- 直接メソッド呼び出しをマネージャーの単一の
executeメソッドに渡されるコマンドオブジェクトで置き換えます - このパターンはスパリングに使用してください。JavaScriptアプリケーションでは不要なボイラープレートが増える可能性があります
詳細
class OrderManager {
constructor() {
this.orders = []
}
placeOrder(order, id) {
this.orders.push(id)
return `You have successfully ordered ${order} (${id})`;
}
trackOrder(id) {
return `Your order ${id} will arrive in 20 minutes.`
}
cancelOrder(id) {
this.orders = this.orders.filter(order => order !== id)
return `You have canceled your order ${id}`
}
}
OrderManagerクラスでは、placeOrder、trackOrder、cancelOrderメソッドにアクセスできます。これらのメソッドを直接使用することは全く有効なJavaScriptです!
const manager = new OrderManager();
manager.placeOrder("Pad Thai", "1234");
manager.trackOrder("1234");
manager.cancelOrder("1234");
しかし、managerインスタンスのメソッドを直接呼び出すことにはデメリットがあります。後で特定のメソッドの名前変更を決定したり、メソッドの機能が変わる可能性があります。
例えば、placeOrderをaddOrderに名前変更することにしたとしましょう!そうすると、コードベース内のどこでもplaceOrderメソッドを呼び出さないようにする必要があり、大規模なアプリケーションではとても複雑になる可能性があります。代わりに、メソッドをmanagerオブジェクトから分離し、各コマンドに対して別のコマンド関数を作成したいです!
OrderManagerクラスをリファクタリングしましょう。placeOrder、cancelOrder、trackOrderメソッドの代わりに、1つの単一メソッドexecuteを持つようになります。このメソッドは渡されたコマンドを実行します。
各コマンドはマネージャーのordersにアクセスする必要があり、これを最初の引数として渡します。
class OrderManager {
constructor() {
this.orders = [];
}
execute(command, ...args) {
return command.execute(this.orders, ...args);
}
}
注文マネージャー用に3つのCommandを作成する必要があります:
PlaceOrderCommandCancelOrderCommandTrackOrderCommand
class Command {
constructor(execute) {
this.execute = execute;
}
}
function PlaceOrderCommand(order, id) {
return new Command((orders) => {
orders.push(id);
return `You have successfully ordered ${order} (${id})`;
});
}
function CancelOrderCommand(id) {
return new Command((orders) => {
const index = orders.indexOf(id);
if (index > -1) orders.splice(index, 1);
return `You have canceled your order ${id}`;
});
}
function TrackOrderCommand(id) {
return new Command(() => `Your order ${id} will arrive in 20 minutes.`);
}
完璧です!メソッドをOrderManagerインスタンスに直接結合するのではなく、OrderManagerで利用可能なexecuteメソッドを通じて呼び出すことができる分離された分離関数になっています。
メリット
コマンドパターンを使用することで、メソッドを操作を実行するオブジェクトから分離できます。特定のライフサイクルを持つコマンドや、キューに入れられて特定の時間に実行されるべきコマンドを処理する場合、より多くの制御が得られます。
デメリット
コマンドパターンのユースケースは非常に限定的で、アプリケーションに不要なボイラープレートが追加されることがよくあります。
ソース
参考資料
- Command Design Pattern - SourceMaking
- Command Pattern - Refactoring Guru
- Command Pattern - Carlos Caballero
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- patternsdev
- リポジトリ
- patternsdev/skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/patternsdev/skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。