私は最近、いくつかの良い、悪いがほとんどmostlyいJavaをうろついているので、この質問に対する答えを追加したいと思います。実際に漠然と有用な真実に似た何かに基づいているかもしれないJS開発者。
IDEはありますが、なぜそれほど多くないのかを理解するのに役立ちます
Nodestormに夢中になり、実際に購入したのは悪くないので、Webstormを試してみましたが、それでもWSよりもSciteでjsファイルを開く傾向があります。これは、JSではるかに少ない労力でより多くのことができるだけでなく、UIの作業により即座にフィードバックが得られるため、ブラウザー開発ツール(特にChromeとFirebug)が非常に優れており、(ブラウザー以外のコンテキストを考慮して)変更されたコードの再実行は、コンパイル手順なしで高速かつ簡単です。
私がかなり確信しているもう1つのことは、IDEでは基本的に、JavaScriptで実際には手に入らない粗雑なコードを有効にすることによって、独自の要求を作成するということです。JSでの管理方法を学びたいですか?IDEなしでJavaで自明ではない何かを書いて、IDEを動かさずにそのコードを実際に維持/変更できるようにするために、あなたがし始めなければならないことに細心の注意を払うことを試みることから始めるのが役立つかもしれません進む。IMO、これらの同じことは、IDEを持っているかどうかに関係なく、保守可能なコードを書くために依然として重要です。4年間のプログラミングカリキュラムを作成する必要がある場合、最初の2年間はツールや依存関係をひねらないようにするためにIDEに触れることはできません。
構造
複雑なアプリケーションを扱う経験豊富なJS開発者は、コードを構造化できます。実際、コードを読むためのIDEがなかった初期の歴史では、よく表現しなければならない傾向がありますが、強力に表現力のある言語は、完全に維持不可能な災害コードベースを非常に迅速に強力に表現できるためです。
私はJavaコードベースを理解するのにかなり急な学習曲線を持っていましたが、ついにそれが適切なOOPでないことに最終的に気付きました。クラスは、BeanまたはDTOまたは静的ゲッター/セッターに存在するグローバルに利用可能なデータを変更する、大まかに関連するメソッドのバンドルに過ぎません。それは基本的に、OOPが置き換えることになっていた古い獣です。だから私は基本的にコードを見て考えることをやめた。ショートカットキーを習得し、めちゃくちゃにたどったところ、すべてがよりスムーズに進みました。あなたがすでに習慣になっていないのであれば、OODについてもっと難しく考えてください。
最高レベルの適切に構成されたJSアプリは、複雑な関数(jQueryなど)と相互作用するオブジェクトで構成される傾向があります。よく構造化され、メンテナンスが容易なアプリは、どの言語でも、IDEまたはNotepad ++のどちらで表示していても完全に読みやすいということを主張します。これは、依存関係の注入とテストファーストTDDを極端に重視することを非常に重要視している主な理由の1つです。
そして最後に、クラスを手放します。プロトタイプの継承を学びます。実際に継承が必要な場合、実際には非常に簡単に実装できます。しかし、合成アプローチはJSではるかにうまくいく傾向があり、個人的に病気になり始め、どの言語でも1つまたは2つ以上の継承レベルが進行しているのを見ると、EXTJSの夜間恐怖症にかかります。
第一のコア原則
私は、他のすべての優れた実践が導き出すべき中核的なものについて話している:DRY、YAGNI、最小限の驚きの原則、問題のある領域の明確な分離、インターフェースへの書き込み、人間が読めるコードの記述は私の個人的なコアです。これらのプラクティスの放棄を提唱するもう少し複雑なものは、どの言語でもクールエイドと見なされる必要がありますが、特に非常に混乱しやすいコードの遺産を次の人に残すのが非常に簡単なJavaScriptのような言語です。たとえば、疎結合は、これまでのところ、オブジェクト間の相互作用がどこで発生しているかさえわからない限り、素晴らしいものです。
動的な入力を恐れないでください
JavaScriptにはコアタイプはあまりありません。ほとんどの場合、動的なキャストルールは実用的で簡単ですが、ルールを学習することは有益であるため、不必要なキャストや無意味な検証ルーチンなしでデータフローを管理することをよりよく学習できます。私を信じて。厳密な型は、パフォーマンスとコンパイル時の問題を見つけるのに最適ですが、何からも保護しません。
JS関数とクロージャーからクラップスを学ぶ
JSの第一級の機能は、おそらく、JSが「クライアントサイドWebに触れるだけの価値がある言語」賞を受賞した主な理由です。そして、はい、実際には競争がありました。また、JSの中心的な機能でもあります。それらでオブジェクトを構築します。すべてが関数にスコープされます。また、便利な機能があります。argumentsキーワードを介してパラメーターを調べることができます。他のオブジェクトのメソッドであるというコンテキストで一時的にアタッチして起動できます。そして、それらは実装するのがわいせつに簡単なものにイベント駆動型のアプローチを作ります。要するに、彼らはJSをソースでの複雑さの軽減とJS自体のさまざまな実装(ただし主にDOM API)の適応において絶対的な獣にしました。
採用前にパターン/プラクティスを再評価する
ファーストクラスの関数と動的な型は、JSでより複雑で多くの複雑なデザインパターンを完全に無意味で扱いにくいものにします。ただし、いくつかの単純なパターンは、JSの非常に柔軟な性質を考えると、非常に便利で実装が簡単です。アダプターとデコレーターは特に便利です。また、作成するUI要素のイベントマネージャーとしても機能する複雑なUIウィジェットファクトリーにシングルトンが役立つことがわかりました。
言語のリードに従い、少ないリソースでより多くのことを実現
私は、Javaヘッドホンチョの1つが、冗長性が実際にすべての関係者にとってコードを理解しやすくする肯定的な機能であるという議論をどこかで行っていると信じています。ホグウォッシュ。それが本当なら、リーガルは読みやすいでしょう。書いたものを理解しやすくすることができるのは作家だけであり、たまに他の人の靴に身を置くことによってしかできません。したがって、これら2つのルールを受け入れてください。1.可能な限り直接的かつ明確であること。2.いまいましいポイントに到達します。利点は、クリーンで簡潔なコードは、トリガーから実際の目的のアクションに到達するために25のレイヤーを横断する必要があるものよりも理解と保守がはるかに簡単なことです。より厳密な言語でそのようなことを提唱するほとんどのパターンは、実際にはJavaScriptにはない制限の回避策です。
すべてが順応性があり、それでいい
JSはおそらく、一般的に使用されている最も保護の少ない言語の1つです。それを受け入れます。正常に動作します。たとえば、コンストラクター関数で通常の変数を宣言するだけで、アクセスできない永続的な「プライベート」変数でオブジェクトを作成できます。これは頻繁に行います。しかし、それは私のコードやコードのユーザーを「自分自身」から保護することではありません(実行中にコードを自分のバージョンに置き換えることができます)。むしろ、他の人が依存関係を壊したくないほど十分に有能であり、おそらく正当な理由で直接それに到達するつもりはないということが前提であるため、意図を示すことです。
サイズ制限はなく、問題のあるドメインのみ
私が見たすべてのJavaコードベースで私が抱えている最大の問題は、クラスファイルが多すぎることです。まず第一に、SOLIDは、OOPについて既に知っておくべきことの紛らわしい反復です。クラスは、関連する問題の特定のセットを処理する必要があります。1つのメソッドに1つの問題はありません。それは、ブートする無意味なクラス構文をすべて追加するだけで、悪い古いチェーンfunc-spaghetti Cコードを取得するだけです。サイズやメソッドの制限はありません。すでに長い関数、クラス、またはコンストラクターに何かを追加することが理にかなっている場合、それは理にかなっています。jQueryを使用してください。これは、単一の機能を備えたライブラリ全体のツールセットであり、何も問題はありません。まだjQueryが必要かどうかは、合理的な議論ですが、デザインの面では、
Javaがすべてわかっている場合は、非Cベースの構文で何かに手を出す
Djangoについて聞いていたことが好きだったのでPythonをいじり始めたとき、構文を言語設計から分離し始めることを学びました。その結果、JavaとCは、同じ構文で異なることを行うことの合計ではなく、言語設計部分の合計として理解しやすくなりました。良い副作用は、デザインに関して他の言語を理解するほど、コントラストを通して最もよく知っている言語の長所/短所をよりよく理解できることです。
結論
さて、これらすべてを考慮して、問題点をすべて見つけましょう。
- 関数のエントリポイントをすぐに見つける方法はありません(プレーンテキスト検索では、呼び出し階層のさらに上のメソッドの検索が行われる可能性があります。
ChromeとFirebugには実際にコールトレースがあります。しかし、構造と物事を簡潔かつ直接的に保つことに関する私のポイントも参照してください。カプセル化された大きな構成要素が相互にやり取りしているとアプリを考えるほど、物事がうまくいかないときに誰の障害であるかを簡単に把握できます。これはJavaにも当てはまります。従来のOOPの問題に完全に対応できるクラスのような関数コンストラクターがあります。
function ObjectConstructor(){
//No need for an init method.
//Just pass in params and do stuff inside for instantiation behavior
var privateAndPersistent = true;
//I like to take advantage of function hoisting for a nice concise interface listing
this.publicAndPointlessEncapsulationMurderingGetterSetter
= publicAndPointlessEncapsulationMurderingGetterSetter;
//Seriously though Java/C# folks, stop with the pointless getter/setters already
function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
if(arg === undefined){
return privateAndPersistent;
}
privateAndPersistent = arg;
}
}
ObjectConstructor.staticLikeNonInstanceProperty = true;
var instance = new ObjectConstructor();//Convention is to capitalize constructors
私のコードでは、{}
内部(プライベート)変数を持つことができず、代わりにデータ構造として使用するために予約することを好むため、オブジェクトリテラルを構造アプリコンポーネントとして使用することはほとんどありません。これは、意図の明確さを維持する期待を設定するのに役立ちます。(カーリーが表示されている場合は、アプリアーキテクチャのコンポーネントではなくデータです)。
- パラメーターは関数に渡され、そのパラメーターで使用可能なプロパティと関数を知る方法はありません(実際にプログラムを実行し、関数が呼び出されるポイントに移動し、console.logsを使用してすべてのプロパティを出力する以外利用可能)
繰り返しますが、最新のブラウザツールをご覧ください。しかしまた、なぜプログラムを再び実行するのはなぜそんなに残念なのでしょうか?リロードは、クライアント側のWeb開発者が通常数分ごとにヒットするものです。何もする必要がないためです。これもまた、アプリ構造が役立つ別のポイントですが、契約の実施が重要な場合に独自の検証を実行する必要があるJSのマイナス面のトレードオフの1つです(コードベースが公開していない他のエンドポイントでのみ行うこと「制御しない」。IMO、トレードオフは利益に見合うだけの価値があります。
- コールバックとしての匿名関数の一般的な使用法は、しばしば混乱するコードパスのスパゲッティにつながり、すぐに移動することはできません。
うん、それは些細ではないことには悪い。しないでください。関数にkidsという名前を付けます。物事を追跡するのも簡単です。以下を使用して、簡単な自明な関数をインラインで定義、評価(割り当てが必要)、および割り当てることができます。
doSomethingWithCallback( (function callBack(){}) );
これで、呼び出しをトレースするときにChromeに名前が付けられます。自明ではない関数については、呼び出しの外で定義します。また、変数に割り当てられた匿名関数はまだ匿名であることに注意してください。
- 確かに、JSLintは実行前にいくつかのエラーをキャッチしますが、それでも、ブラウザーでコードの下に赤い波線を表示するほど便利ではありません。
決して触らない。Crockfordはコミュニティにいくつかの良いものを与えましたが、JSLintは線を越えてスタイル設定を行い、JavaScriptの特定の要素は悪い理由ではないことを示唆しています。regExおよび否定クラスの後にある*または+については、そのことを完全に無視してください。ワイルドカードのパフォーマンスは低下し、{}で繰り返しを簡単に制限できます。また、関数コンストラクタについて彼が言ったことは無視してください。新しいキーワードがわずらわしい場合は、簡単にファクトリー関数にラップできます。CSSLint(Crockfordのものではない)は、悪いアドバイスの面ではさらに悪い。たくさんの話し合いをする人は、常に一粒の塩を使ってください。時々、私は彼らがただ権威を確立するか、新しい素材を生み出すことを探していると誓います。
繰り返しになりますが、この実行時の懸念から学んだことを学ぶ必要があります。(これは私が多くのJava / C#開発者で見た一般的なものです)実行時のエラーが2年後も気になったら、落ち着くまでブラウザに座ってスパムをリロードしてください。コンパイル時/ランタイムの分割はありません(とにかく目に見えるものではありません-JSは現在JITで実行されています)。実行時にバグを発見するだけでなく、非常に安く簡単にスパムのリロードを行い、到達するすべての停止ポイントでバグを発見することは非常に有益です。
そして、これらのChrome開発ツールをクラックしてください。Webkitに直接組み込まれています。Chromeを右クリックします。要素を検査します。タブを探索します。実行中にコンソールのコードを変更する機能を備えた豊富なデバッグ機能は、最も強力ですが、あまり目立たないオプションの1つです。テストにも最適です。
関連するメモでは、エラーは友達です。空のcatchステートメントを記述しないでください。JSでは、エラー(または少なくとも私達はべきではありません非表示または埋葬していない咳 YUI /咳)。私たちは彼らに出席します。それ以下はデバッグの苦痛をもたらします。そして、catchステートメントを作成して、本番環境で潜在的なエラーを隠す場合は、少なくとも静かにエラーを記録し、ログへのアクセス方法を文書化します。