再遇設計モードのJavaScript編

4880 ワード

何事も初めが難しく、シーズンを経験している先端プレーヤとして、初めて自分に何かを書きたいということを忘れていました.もしあなたも私と同じであれば、私のように今からこの文章を見てから、コンピュータを開いて、あなたの最初の文章(あるいはいかなる形式の文字)を叩いてください.
まず、respectは以下の文章の内容は全部最近読んでいる本から来ています.著者の苦労に感謝します.以下の内容は個人の読書ノートです.もし理解が間違っていたり、不適切な内容があれば、いつでも変更や削除に連絡してください.その次に、各道の大神dissを歓迎します.最後に、これから正式に私のflowを始めます.
一、デザインモードとは?
コードに関する仕事をしている人はいずれも多かれ少なかれ「デザインモード」という言葉を聞いています.個人的に見ると、デザインモードは「套路」です.このコースを知ったら、問題を解決する技能が多くなります.これが分からないと何も説明できないですが、まとめていないか、あるいは使っているかは分かりません.本当に知らなくても大丈夫です.この文章から始めましょう.
デザインモデルの思想は建築業界に由来し、建築学の研究者は20年にわたって建築中に同じ問題を解決するために設計された異なる建築構造を総括しました.その中から品質の高い似たような汎用構造を見つけました.「設計モード:対象ソフト向けの基礎を多重化できる」に入力します.
設計モードの定義は、オブジェクト指向のソフトウェア設計において、特定の問題に対する簡潔で優雅なソリューションである(オブジェクト指向である必要はない).一般的に言えば、デザインモデルは私達のソフトウェア開発の過程でよく使われていたいくつかのコースに名前をつけてくれて、大きく見えるものになりました.
建築は異なった風格のために同じ構造に対していくつかの異なった設計をすることができます.ソフトウェアにとっても同じです.言語も違っています.デザインの実現も違います.googleのある大神さんは以前、23種類のデザインがlispでデフォルトで実現されたと記事で指摘しました.例えば、命令モードは、javaでコマンドクラス、受信者クラス、1つの使用者クラスが必要で、コマンドオブジェクトを受信者クラスの中であちこちに転送します.しかし、lispやjavascriptのような関数を一等公民として使う言語では、関数自体が対象の中でお互いに伝達できるので、コマンドモードはこの2つの言語の中で一種の暗黙的なモードになります.
知者の話では、凡そ程度があるということです.デザインモードを吹聴したり、デザインモードを貶めたりするのは、あなたには理があるとしか言えません.私は四海に置くべきものがないと思っています.あるなら、あるでしょう.デザインモードではないです.なぜデザインパターンが簡潔で優雅な解決策というのは、ソフトウェア開発の観点から見れば、頑丈で容易に拡張することが非常に重要な測定指標であり、デザインモデルはまさにこの問題をよりよく解決するのに役立つからです.なぜ「度」というのかというと、デザインモードも開発の過程で使うには適していないからです.簡単な小さいプロジェクトの中で、関数一つで完成できる機能を明らかにするために、ヒョンジュンやその他の原因でなければならないために、多くのコードを追加して一つのパターンを実現して、プロジェクトコードがたくさん増えて、自然にバグの確率が増加しました.また、一度使うものなのに、無理なデザインをしてモードを拡張する必要はありません.
二、設計モードの一例モード
シングルモデルは設計モードの中で一番簡単なモデルであるべきです.多くの本の中で一番最初に言います.一例として、名前の通り、一つのクラスが一例しかないことを保証し、プロジェクトコードの中で大域的にアクセスできます.
対象に向けた言語では、例えば、c+++、javaなど、単一の例のモードは通常、クラスを定義する際に、構造関数をprvateに設定し、オブジェクトが外部でnewに出られないことを保証し、クラスに静的な方法を定義して、この唯一のインスタンスを取得または作成するために使用される.javascriptもこのプロセスを真似して一例を実現できます.コードは以下の通りです.
var Singleton = function (name) {
  this.name = name;
  this.instance = null;
}

Singleton.getInstance = function(name) {
  if (!this.instance) {
    this.instance = new Singleton(name);
  }
  return this.instance;
}
コードの中でSingletonを使用する必要があるのは明らかです.Singleton.getInstance('PGOne')だけで唯一のインスタンスが得られます.しかし、いくつかの欠陥があります.私たちがnew Singleton('Gai')を作った時に、まだnewで実例を出すことができます.
var Singleton = function (name) {
  this.name = name;
  this.instance = null;
}

var ProxySingleton = (function () {
  var instance;
  return function (name) {
    if (!instance) {
      instance = new Singleton(name);
    }
    return instance;
  }
})();
このような実装では、Singletonの例をnew ProxySingleton('PGOne')を介して取得することができ、単一の例の制御はプロキシクラスに分離され、Singletonの純粋さを保証する.Singletonをプライベート変数にカプセル化し、直接的なnew呼び出しを徹底的に阻止することもできます.
これらはJavaScriptで静的言語c+またはjavaの単一例モードを模倣したものですが、JavaScriptでは、やや奇妙で余分なように見えます.JavaScriptは無類(class-free)言語として、生まれてきた単例パターンはあまり意味がないからです.JavaScriptでは、一般的なオブジェクトは非常に簡単です.もし一つの例が必要なら、文字どおりのオブジェクトを宣言するだけでいいです.グローバル変数として、構築関数を宣言する必要がありますか?大域変数は一例モードではないが、JavaScriptでは、大域変数を一例モードとして使用しています.しかし、グローバル変数の最大の問題は、グローバル空間を汚染することであり、これまでのグローバル変数の濫用は、悪いコードと見なされてきました.グローバル変数の影響を最小限に抑えるために、JavaScriptでは、名前空間とクローズドプライベート変数が慣用的な手段となっている.JavaScriptでは、一例としてはどうなっていますか?JavaScriptの最終的な例は以下の通りです.
var Singleton = function (fn) {
  var result;
  return function () {
    return result || (result = fn.apply(this, arguments));
  }
}

var createSingleDialog = function() {
  var div = document.createElement('div');
  div.innerHTML = '    ';
  div.style.display = 'none';
  document.body.appendChild('div');
  return div;
}

//   
var getDialog = Singleton(createSingleDialog);

document.getElementById('btn').onclick = function () {
  var dialog = getDialog();
  dialog.style.display = 'block';
}
上のコードでは、Singletonは汎用的なプロキシマネージャであり、異なる機能関数を入力することによって、単一のインスタンス取得器に戻ることができる.上記のコードでは、弾戸を取得するための一例であり、ナビゲーションバーに入って関数を生成することにより、ナビゲーションバーの一例を取得することもできる.また、上記のコードでは、単一の例は必要な時にのみ作成され、これは単一の例のパターンでも必要ですが、グローバルオブジェクトとクローズドによって実現される単一の例は、確かに最初にインスタンスを作成しました.
説明が必要なのは、javascriptのアプリケーションシーンは主にブラウザにありますので、dom操作によっても同じように単例ができます.だからnewのように単例で使うシーンは大きくないように見えます.実際の開発においては、非同期でデータを取得した後や、パチンコが出てきた時に、一部のdom元素にバインディングするイベントがしばしば発生します.例えば、データの展示と操作を担当するポップアップウィンドウがありますが、そのたびに新しいデータを弾倉のdom要素に結びつける必要があります.その時、domに重複したバインディングイベントが発生します.上のコードはこの問題を完璧に解決することができます.
var bindEvent = getSingle(function () {
  document.getElement('btn').onClick = function(){
    alert('new data');
  }
  return true;
});

var showDialog = function () {
  console.log('    ');
  bindEvent();
}

showDialog();
showDialog();
初めてものを書きますが、一つのことをはっきり書きたいというのは複雑なことです.
久しぶりに友達の突然の食事を誘って、友達に一日の家を運んであげました.いろいろな言い訳があって、もう少しでこの内容を絞め殺しそうになりました.今日は大丈夫です.コピーして貼り付けて、無理に書いてください.
デザインモードは、未完です....
番外:to be realはクールですが、realのためにrealしないでください.人々は自由に憧れていますが、世界にはルールがないといけません.すみません、わからないふりをしないでください.中国はヒップホップの観測感があって、私は万磁気の王に立ちます!