一般的に、私たちは Node.js のデザイン パターン (オブザーバー) またはファクトリー (ファクトリー メソッド) についてよく知っています。この記事では、Node.JS のいくつかの基本的なパターンの実装方法を紹介することに焦点を当てています。興味のある方は、Script House のエディターをフォローしてください。さて、この記事ではそれらについて具体的に説明しません。ここでは、依存関係の挿入やミドルウェアなど、Node.JS のいくつかの基本的なパターンの実装について説明します。これが皆さんのお役に立てれば幸いです。
デザインパターンとは何ですか?
デザイン パターンは、一般的でよく発生する問題を解決するために使用される再利用可能なソリューションです。
Singletons (Singleton)
Singletons パターンは、「クラス」を 1 つのインスタンスのみに制限します。 Node.js でシングルトンを作成するのは非常に簡単です。たとえば、以下の例のようになります。
//area.js var PI = Math.PI; function circle (radius) { return radius * radius * PI; } module.exports.circle = circle;
何度参照しても、単一のインスタンスとしてのみ存在します。
var areaCalc = require('./area'); console.log(areaCalc.circle(5));
この require の実装により、シングルトンはおそらく NPM モジュールで最も一般的な Node.js 設計パターンになります。
オブザーバー
リスニング/観察リストを維持し、状態が変化したときに自動的に通知するオブジェクト。オブザーバー パターンを実装するには、EventEmitter が便利です。
そうです以上で、observable を実装しました。これを使用するには、いくつかのメソッドを追加しましょう。
// MyFancyObservable.js var util = require('util'); var EventEmitter = require('events').EventEmitter; function MyFancyObservable() { EventEmitter.call(this); } util.inherits(MyFancyObservable, EventEmitter);
素晴らしいです。このイベントを聞いて応答してみてください。
MyFancyObservable.prototype.hello = function (name) { this.emit('hello', name); };
Factories (ファクトリ メソッド)
ファクトリ パターンは、コンストラクターを使用する必要のない作成者パターンであり、オブジェクトを作成するための共通のインターフェイスを提供します。このパターンは、作成が非常に複雑なオブジェクトを生成するために使用できます。
var MyFancyObservable = require('MyFancyObservable'); var observable = new MyFancyObservable(); observable.on('hello', function (name) { console.log(name); }); observable.hello('john');
ファクトリーを使用すると、依存関係を注入できるため、テストが容易になります。
依存関係の注入
依存関係の注入は、1 つ以上の依存関係 (またはサービス) が注入されるか、依存オブジェクトへの参照によって渡される設計パターンです。
この例では、データベースの依存関係を取得するユーザーモデルを作成します。
function MyClass (options) { this.options = options; } function create(options) { // modify the options here if you want return new MyClass(options); } module.exports.create = create;
それでは、それを使用してインスタンスを作成しましょう:
function userModel (options) { var db; if (!options.db) { throw new Error('Options.db is required'); } db = options.db; return { create: function (done) { db.query('INSERT ...', done); } } } module.exports = userModel;
なぜ便利なのでしょうか?これによりテストが容易になります。単体テストを作成するときに、偽のデータベース インスタンスをモデルに挿入できます。
ミドルウェア/パイプライン ミドルウェア/パイプライン
ミドルウェアは強力かつシンプルな概念です。つまり、1 つの機能ユニットの出力が次の機能ユニットの入力になります。 Express を使用したことがある場合は、すでにこのパターンを使用していることになります。
Koa がどのように行うかを見てみましょう:
var db = require('./db'); var userModel = require('User')({ db: db });
したがって、基本的に、ミドルウェアを追加すると、それはミドルウェア キューにプッシュされるだけです。しかし、リクエストがこのサーバーに到着すると何が起こるでしょうか?
app.use = function(fn){ this.middleware.push(fn); return this; };
魔法のようなことは何もありません - ミドルウェアは次々に呼び出されます。
ストリーム
ストリームを特別なパイプとして扱うことができます。これは、大きなデータ ストリーム、つまりオブジェクトではなくバイトを処理するのに適しています。
var i = middleware.length; while (i--) { next = middleware[i].call(this, next); }
PHPデザインパターンのサービスロケーターパターン例の詳細説明
以上がNode.js の一般的な基本設計パターンの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。