私たちの会社では、かなり大きなPrototypeJSベースのJavaScriptコードを使用していますが、いくつかの理由でjQueryに移植しています(ここではそれほど重要ではありません)。移植中に物事を整頓/整理するためのコーディングガイドラインを設定しようとしています。
プロトタイプベースの実装を歩くことからの1つの観察は、多くのコードがOOPスタイルで(プロトタイプのClass.create
を使用して)書かれているが、コードは精神で「オブジェクト指向」ではないということです。 。私が見た一般的なパターン:呼び出すと予想される1つの「コンストラクター」(ただし、コンストラクターはハードコードされたDOM IDを使用するため、2回呼び出すことはありません)、予想外の他の「関数」とイベントハンドラーの束を呼び出す(ただし、JavaScriptには「プライベート」がないため、それを知らないため)およびthis
を介してこれらすべての関数間でデータを共有します。呼び出し側の観点から見ると、「callable " 何もありません。
私はJavaScriptのOOPは回避できる可能性があり、おそらく回避すべきであると多くの場合に信じ始めています。少なくとも、次世代のGoole Wave UIではないが、簡単に言えば、AJAXベースの拡張機能、いくつかのイベントハンドラーをあちこちに登録、マイナーなDOM操作など) 。
他の言語/プラットフォームのように、JavaScriptのOOPは神聖なマントラとして実際にそれをカットしないというこの気持ちに対する幅広いサポートがあるかどうか疑問に思っています。どのような非OOP /クロージャベースのパターンがはるかに望ましいか。
人々はOOPで高度なパターンに巻き込まれる傾向があります。 MVC、MVVM、MVVC、およびその他すべての「M」、「V」、および「C」の順列。 20,000行以上のjsプロジェクトを開いたことは一度もありませんでした。「ありがとうございます、これはMVCにあります」。20,000行以上のプロジェクトのほとんどは、ひどい混乱を招くためです。
そうは言っても、大規模なプロジェクトはOOPなしではほぼ不可能だと私は思います。少なくとも、複雑なオブジェクトを作成して別々のファイルに保存し、dojoなどのライブラリを使用して衝突からオブジェクトを名前空間で保護する機能により、何千時間もの苦痛なデバッグを節約できます。
「ああ」と自分に言うかもしれませんが、「まあ、関数のモジュラーグループを別々のjavascriptファイルに書き込めます。それらの中で最高のものを使用できます。OOPを使う必要はありません。」ええと、おめでとうございます。あなたは既にOOPを知らなくても効果的に使用しているためです。そのため、実際にクラスを使用して、さらに進んでみませんか?
Javascriptがプロトタイプモデルに依存していることは事実ですが、OOPのベースは継承/カプセル化/ポリモーフィズムであり、javascriptはそれを完全にうまく実行できます。dojo.jsをご覧ください。
私はいくつかのことを指摘することが重要だと感じています:
フープを飛び越えてJavaScriptをそうでないものに変えたい場合、結果に不満を感じるかもしれません。そのため、代わりに、JavaScriptにコンパイルできるが、プログラミング言語に似せたい言語に近いものを選択できます(Haxe、ParenScript、TypeScript、CoffeeScript、ScriptSharp、Dart、Java( GWTを介して)、C/C++(Emscriptenを介して)...実際、他のほとんどすべての一般的な言語をさまざまな品質のJavaScriptに変換できます)。
しかし、JavaScriptを使用すると、「クラスOID」、ミックスイン/トレイト、AOPなどを許可しない言語が見つかります。多くの場合、Java特有のイディオムに制限することは最善のアイデアではない可能性があることに気づくでしょう。それにもかかわらず、それらは時々間違いなく役に立つでしょう。
プロトタイプベースの実装を歩くことからの1つの観察は、多くのコードがOOPスタイル(プロトタイプのClass.createを使用)で記述されている)が、コードは精神で「オブジェクト指向」ではないことです。私が見た一般的なパターン:呼び出すと予想される1つの「コンストラクター」(ただし、コンストラクターはハードコードされたDOM IDを使用するため、2回呼び出すことはありません)、その他の「関数」とイベントハンドラーの束(ただし、JavaScriptには「プライベート」がないため、それを知らないため)、これを介してこれらすべての関数間でデータを共有します。呼び出し側の観点から見ると、「呼び出し可能」は1つだけで、他には何もありません。
すべてのJavaScriptプロジェクトがOOPを必要とするわけではありません。 ExtJSのような既存のOOフレームワークを使用していない限り、私はそこに行きません。あなたの場合、OOPの唯一の使用は誤用ですが、 jQueryに切り替えるので、jQueryプラグインアーキテクチャに従ってください。必要に応じてカスタムプラグインを作成してください。