プログラマーは静的言語に慣れていて、Javascriptツールの欠如にどのように対処していますか


28

私はほとんどの場合、ほとんどの場合、コンパイルされた言語、特にJavaでのみプログラミングを行ってきました。Javaについての私のお気に入りの1つは、Eclipseのようなツールを使用するとき、どれだけ生産性が高く、実際にコードを書く必要があるかということです。

あなたはできる:

  • メソッドとクラスを簡単かつ自動的にリファクタリングします
  • メソッドが呼び出された場所、または定数が使用された場所をすべて即座に表示する(コール階層を開く/参照を表示)
  • 静的型付けとは、コード補完を使用して、オブジェクトで使用可能なすべてのパラメーター/関数を表示できることを意味します
  • Ctrlキーを押しながら関数/メンバー/クラス名をクリックして、その定義に直接移動します

これらすべての機能は、IDEが私の親友であると感じさせます。Javaコードを記述し、特に他の人のプログラムを理解するのがはるかに簡単になります。

しかし、私はますますJavascriptの使用を求められており、これまでの私の経験は非常に否定的でした。

特に:

  • 関数のエントリポイントをすぐに見つける方法はありません(プレーンテキスト検索では、呼び出し階層のさらに上のメソッドの検索が行われる可能性があります。

  • パラメーターは関数に渡され、そのパラメーターで使用可能なプロパティと関数を知る方法はありません(実際にプログラムを実行し、関数が呼び出されるポイントに移動し、console.logsを使用してすべてのプロパティを出力する以外利用可能)

  • コールバックとしての匿名関数の一般的な使用法は、しばしば混乱するコードパスのスパゲッティにつながり、すぐに移動することはできません。

  • 確かに、JSLintは実行前にいくつかのエラーをキャッチしますが、それでも、ブラウザーでコードの下に赤い波線を表示するほど便利ではありません。

結局のところ、プログラム全体を常に頭に置く必要があるということです。これにより、複雑なプログラムを作成するための認知的負荷が大幅に増加します。そして、心配するこれらすべての余分なものは、実際の創造性と問題解決のための私の脳内のスペースを少なくします。

確かに、正式なクラス定義全体を記述するよりも、オブジェクトを一緒にスローする方が高速です。しかし、プログラムはわずかに簡単かつ迅速に作成できますが、私の経験では、プログラムの読み取りとデバッグははるかに困難です。

私の質問は、他のプログラマーがこれらの問題にどのように対処するかということです。Javascriptは明らかに人気が高まっており、私が読んだブログは、これらの問題の解決策を必死に見つけようとするのではなく、人々の生産性に関するものです。

GWTを使用すると、代わりにJavaでJavascript環境のコードを記述できますが、私が期待するほど広く使用されているようには見えません。実際、人々は複雑なプログラムにはJavascriptを好むようです。

私は何が欠けていますか?


8
JSで苦労しているすべてのJava開発者への私のアドバイスは、Cベースの構文を持たない別の言語を学ぶことです。JSに戻ったときに構文の類似性を乗り越えるのに役立ち、すべてのコードと方法を書くための1つの真の方法で物事を見るのではなく、言語設計のトレードオフの観点から物事を検討し始めるのに役立ちます他の誰もが間違っています。また、UIフレームワークを作成するというアイデアをお持ちの場合は、JavaScriptを学習してから、無知なCTOに販売するのが不可解に簡単な、さらに肥大化したクラスカスケードガベージを悲しませてください。
エリックReppen

5
2年前に私がどんなスノッブだったのか。私は最近、Javaをより強く攻撃しているので、もう少し役立つようにしようと思います。IDE?Jetbrains Webstorm(私はまだSciteを主に使用していますが、WSは悪くありません)を確認してください。しかし、クライアント側のWebの場合、Chromeの開発ツールはデバッグであなたをカバーするかなり良い仕事をし、実際にスニペットを書くときにオートコンプリートを実行しますコンソールのコード。また、OOPについて考えるのに多くの時間を費やしてください。IMO、非オプションクラス、および人間の可読性の代替としてのIDEは、世の中の多くのJavaでOOPの全ポイントを完全に殺害しました。
エリックレッペン

2
あなたの痛みが分かります。JavaScriptへのドロップダウンは、クライアント側でのアセンブリ言語へのドロップダウンのWebバージョンです。確かに楽しいこともありますが、ツールセットは弱く、生産性が低下するため、必要な追加作業がすべて必要になります。それがプログラミングの人生です。すべてが最高レベルの抽象化で行われるわけではありません。:-)
ブライアンノブラウチ

2
@ErikReppen私はJava開発者として始めましたが、Ruby、Delphi、C ++、C#、Prolog、PHP、bashでプログラミングされたObj-Cに堪能であり、javascriptの読み取りと管理は最悪です。
サルタン

2
TypeScriptを見てください。使用を開始すると、クライアント側のコーディングの生産性が大幅に向上します。適切なインテリセンスと初期のコンパイラ警告を打ち負かすのは難しい。
エフゲニー

回答:


22

IDEベースの機能は、javascriptなどの動的言語では使用できません*。あなたはそれらなしでやることを学ばなければなりません。ツールのサポートをより優れた設計に置き換える必要があります。

手で、またはrequirejsなどのツールを使用して、モジュールパターンを使用します。モジュールについては簡単に判断できるように、モジュールを小さくしてください。

多くのタイプを定義しないでください -呼び出しポイントの近くで作成された匿名オブジェクトを使用してください。次に、呼び出し元と呼び出し先を見て、何が起こっているのかを知ることができます。

コードをDOMに結合しないようにしてください -コードで行うDOM操作の量を制限するように一生懸命に努力してください。セレクターまたはjQueryコレクションを渡すことができる場合は、コードにページ構造を知らせるのではなく、そうしてください。

* 人気のあるライブラリを使用している場合、偽のオートコンプリートを取得できますが、「このオブジェクトが持つプロパティ」ではなく、「すべてのjqueryメソッドを表示」に似ています。入力は節約されますが、正確性は保証されません。


ツールの欠如に対処する方法に関する建設的なアドバイスのためにこれを受け入れます。
funkybro

3
「それらなしでやることを学ばなければならない。」または、それを廃棄するか、JavaScriptを生成し、適切なツールを備えた高レベル言語を使用します。
デン

@Den:高度なツールを備えた高レベル言語の提案はありますか?私の経験では、一般的な言語向けに高度なツールが作成されています。javascriptにコンパイルされる高レベルの言語には、このようなツールを使用するのに十分な人気がありますか?
ショーンマクミラン

1
@SeanMcMillan:いくつかの.NET(C#/ F#)の例である jsil.orgprojects.nikhilk.net/ScriptSharpsharpkit.netwebsharper.com
デン

1
@SeanMcMillan Javaはまた、GWTの参照developers.google.com/web-toolkit
funkybro

24

私は最近、いくつかの良い、悪いがほとんど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ステートメントを作成して、本番環境で潜在的なエラーを隠す場合は、少なくとも静かにエラーを記録し、ログへのアクセス方法を文書化します。


3
...答えの大きさのためにUpvoting
フロリアンMargaine

5

あなたが言っているのは、JavaScriptを見るJava志向の一般的な不満です。

最初に質問に答えましょう...

... 私の質問は、他のプログラマがこれらの問題にどのように対処するかです ...

回答:彼らはしません。彼らは、最初にJavaカルトを放棄することにより、JavaScriptの哲学を学びます。

この前提を理解する必要があります ... JavaScriptはJavaではありません。 それは単に構文に関するものではなく、哲学に関するものです。

では、それらのいくつかを取り上げましょう...

  • メソッドが呼び出された場所、または定数が使用された場所をすべて即座に表示する(コール階層を開く/参照を表示)

    Ctrlキーを押しながら関数/メンバー/クラス名をクリックして、その定義に直接移動します

    これらはすべて利用可能です-適切なIDEを選択してください。

  • 静的型付けとは、コード補完を使用して、オブジェクトで使用可能なすべてのパラメーター/関数を表示できることを意味します

    これはあなたが対処する問題ではありません。これは、プログラミングの見方を変える必要があるものです。緩い型システムはJavaScriptの強みの1つです。ルーズタイピングを理解し、感謝することを学びます。さらに、コード補完はJSで非常にうまく機能します。

  • 確かに、JSLintは実行前にいくつかのエラーをキャッチしますが、それでも、ブラウザーでコードの下に赤い波線を表示するほど便利ではありません。

    Firebug、Chrome / Safariコンソール、およびIDEでさえ、これらすべてを実行します。

    Javaプログラマーが慣れている気の利いた静的分析を実行できるJSHintがあります。

  • 結局のところ、プログラム全体を常に頭に置く必要があるということです。これにより、複雑なプログラムを作成するための認知的負荷が大幅に増加します。

    違う!それどころか、JavaScriptは「軽量」プログラミング言語であり、よりシンプルなプログラムを作成することをお勧めします。Doug Crockfordが言うように... JavaScriptでモデルベースのプログラムを作成しようとすると、あなたを「罰します」。

  • プログラムの方がわずかに簡単かつ迅速に作成できますが、私の経験では、プログラムの読み取りとデバッグははるかに困難です。

    完全に間違っています!プログラミング言語に基づいて読みやすさをどのように決定しますか?プログラムは読みやすい(または読めない)-言語ではありません。さらに、JavaScriptには素晴らしいデバッガがあります。

少し失礼なことに聞こえたらご容赦ください。しかし、JavaScriptを理解するには、Javaの性質を変える必要があります。

JavaScriptを評価できるのは「成熟した」Javaプログラマーだけです。そして、あなたが評価していないものをマスターすることはできません。繰り返しますが、率直に言って申し訳ありません。


2
「関数/メンバー/クラス名をコントロールクリックして、その定義に直接進む」ことができるJavaScript IDEの例はありますか?JavaとScalaにはEclipseを使用していますが、JavaScript用の優れたIDE /エディターがありません。
ジョナス

11
いくつかの批判を受け入れる準備をしましたが、ここにあるいくつかのことはかなり間違っています。オブジェクトを作成し、それを関数に渡すと、Ctrlキーを押しながらパラメーターをクリックしてそのプロパティを表示できますか?いいえ、できません。オブジェクトは何でもかまいません。オブジェクトプロパティ名の1つのスペルを間違えた場合、警告が表示されますか?いいえ、それはJSのエラーではないので、そうではありません。有用なコード補完は不可能です。関数のパラメーターがどのプロパティを持っているかを調べるには、関数が呼び出されたコードを調べて、オブジェクトが作成された場所を調べる必要があります。
funkybro

3
JSの構築方法により、IDEがコードを作成するのが難しくなることに不満を言うことができます。Javaでは、実行中に動的プロパティを単に好きなものに近づけたり、オブジェクトを内省したりすることはできないと文句を言います。2つの言語の哲学は大きく異なります。私は、JSと他のほとんどの言語との間よりも、Java開発者とJS開発者との間のより大きな切断を作成する方法で考える。個人的には、CはJavaよりも適応しやすいと感じており、肥大化したIDEでの作業を嫌っています。
エリックReppen

2
GoogleのJava開発者でさえ、JSを書くときにJavaから頭を出すことはできないようです。sitepoint.com/google-closure-how-not-to-write-javascript
エリックReppen

3
:あなたは書き込みのJavaScriptは、Javaではありませんし、あなたはJavaScriptを理解するためにあなたのJavaの処分に変更する必要が続い:...唯一のJavaプログラマはJavaScriptを味わうことができる「成熟」をだから、すべてについてのを忘れて、その後Javascriptを私が最初にJavaを習得する必要があります理解し、するために、それ?
カレブ

3

一般的に、動的言語用に言及したツールを用意するのは困難です(IDEがランタイムの一部(つまりSmalltalk)でない限り)。そうは言っても、非常に優れたテキストエディタを習得すると、ほとんどのIDEの魅力は低下します。これは少なくとも私の経験です。


2

それは、型付けの悪い言語を使用した場合に支払う価格です。この憎しみがなぜそんなに人気になったのか不思議に思うだけです。欠点は、型付けが不十分な言語の利点をはるかに上回ります。

おそらく、私たちはこのジャンクに非協力原則を適用して、それを消滅させる必要があります。


3
「型が不適切な言語」-多くのプログラマーはあなたに反対するでしょう。
ショーンマクミラン

7
+ 1、Javascriptが人気がある唯一の理由は、適切なタイミングで適切な場所にあったためです。
maple_shaft

2
ああ、Node.jsがJavaではなくC ++にバインドしているのは悲しいですね。
エリックレッペン

1
「型が不適切な言語」の意味がわかりません。JavaScriptは「型指定が不十分」ではありません。動的に型指定されており、操作によって型強制が発生する場合があります。エディター/ IDEが変数のタイプを知らないので、言語を非難しないでください-とにかくそれを知っているべきです。
ライアンキナル

3
@RyanKinal本当に?アプリ全体のすべてのオブジェクトとクラス、および言語のAPIと使用しているライブラリのすべてのプロパティとメソッドをメモリで知る必要がありますか?IDEのコード補完という概念を拒否し、認知的な負荷を減らして考えるものを減らして生産性を大幅に向上させますか?
-funkybro

2

以前はJavaScript(およびその動的型付け)が嫌いでしたが、オブジェクト指向、クロージャ関数型プログラミングに感謝するようになりました。また、私が最初にそれらを見つけたとき、そのグローバルオブジェクトサイレントタイプ変換の削除は新鮮な空気でした。

JavaScriptの私の好みはwebstormです。jQueryのインテリテキストを簡単に動作させることができます(恥ずかしいことではありません)。

また、私はそれが成長しているとは言いません-その遍在性はすでにあります。

あなたの特定のポイント:

関数のエントリポイントをすぐに見つける方法はありません

私はこれを理解していません、どうすればもっと簡単になりますか?

パラメーターは関数に渡されますが、そのパラメーターで使用可能なプロパティと関数を知る方法はありません

オブジェクト定義を含めるようにIDEを設定すると、オブジェクトのプロパティはインテリテキスト経由で利用できます(ただし、ここであなたのポイントを見逃している可能性があります)。

コールバックとしての匿名関数の一般的な使用法は、しばしば混乱するコードパスのスパゲッティにつながり、すぐに移動することはできません。

一般的な使用法 匿名関数が気に入らない場合は、使用しないでください。または、実質的にそれらを使用するjQueryを参照していますか?ほとんどのWeb開発者は、 jQuery をWeb開発の歴史の中で最大の時間節約になる考えています。

JSLintは実行前にいくつかのエラーをキャッチします

それはそれらのすべてをキャッチします、あなたはあなたのideにそれを含めることができます。または、Webstormにはデフォルトで含まれています(私は思う)。


公平でユビキタスで人気があるということは、必ずしも同じではありません!;-)とにかく、webstormはJavaScript用の優れたIDEです(無料ではありませんが、かなり安価です)。私はそれを使用していませんが、IntelliJ(Jetbrainsからも)には、Javaのバックグラウンドから単一のIDEを使用する場合に関連する可能性がある同じ機能が含まれていると思います。
-FinnNk

OK多分明確にする必要があります...ブラウザ/ DOMを使用しない開発のコンテキストで、「人気の高まり」を意味しました。すなわち、他の代替手段が利用可能な場合に使用されます。「関数のエントリポイント」とは、関数が呼び出されるコード内のポイントを見つけることを意味しました。パラメータのプロパティ:IDEが実行前に特定のオブジェクトのプロパティを知る方法はありません!匿名関数:私はそれらが好きではないかもしれませんが、私がコードを維持する必要がある他の人は好きです。たとえば、JSLintは、特定のオブジェクトのプロパティ名を誤って入力したかどうかを知りませ
-funkybro

@funkybro "IDEが実行前に特定のオブジェクトのプロパティを知る方法はありません。" IDEに参照スクリプトとして "whateverMyObjectIs.js"を含めるだけで、プロパティ名の入力が間違っている場合はwebstormを試してください(もし私が正確に覚えていれば)。
ニムチンプスキー

3
存在しない!次のコードを検討してください var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); 。IDEがmyFuncparamパラメータでコード補完を提供する方法を教えてください。 paramプロパティを持つ任意のタイプのオブジェクトにすることができます。
funkybro

はい、しかし、おそらくあなたが渡すパラメーターはそのコンテキストで実際に利用可能です。パーサーは、独自の完全なJSインタープリターにならずにそれを整理できます。
エリックReppen

2

私は何が欠けていますか?

JavascriptがJavaより優れている2つの大きな利点がありません。

  • Javascriptコードは、同等のJavaコードの約4分の1のサイズです。
  • コンパイルとサーバーの再起動を待つ必要はありません。

Javascriptでの作業が異なります。一度に少しずつコードを追加します。テストできる範囲でできるだけ少なくし、ブラウザーを更新してテストします。jQueryを使用する場合、ほとんどの場合、2行のJavascriptだけで十分です。

Javaプログラミングは比較的非生産的であることがわかりました。現在、サーバー側のコードはすべて同じ2つの理由でGroovyで記述しています。


5
「Javascriptコードは、同等のJavaコードの約4分の1のサイズです」<-これが問題です!匿名関数を作成し、オブジェクトに追加のプロパティを追加し、それらを紙吹雪のように投げるのは確かに高速です。しかし、他の誰かがあなたのコードを訪れ、何が起こっているのかを理解しようとするときはどうでしょうか?それに、Javaのコードが多くても、タイピングの回数が増えるとは限りません... Eclipseがそれを書いてくれます。
-funkybro

3
@funkybro:Eclipseはそれを書いています...それから私はプロジェクトの寿命のためにそれを過ぎて見つめています。それが必要であるが、些細なプラグインがそれを生成できるなら、それは言語のにおいです。Javascriptクラスにはもう少しドキュメントが必要なのは当然です。しかし、Javaメソッドのシグネチャを知るだけでは十分ではありません。
ケビンクライン

1
必須ではありません!常にリフレクションを使用してメソッドを呼び出し、本当に必要な場合はプレーンなオブジェクト、リスト、およびマップのみを使用して、JavaでJavascriptをシミュレートできます。ただし、ほとんどの開発者IME(私がすべてを告白するわけではありません!)、意味のあるデータ型を定義すること選択します。
-funkybro

1
リフレクションにより、Javaは実行時にオブジェクトを変更できますか?クロージャーはどうですか?批判する前に言語を学ぶか、Javaを想定してください。Javaは、アセンブリの外で最も閉じたパラダイム言語であり、エミュレートできます。
エリックReppen

1
Downvoters:これはJavaとJavascriptの国民投票ではありません。理由なく下票するのは失礼です。
ケビンクライン

0

私はこの質問が古いことを知っていますが、同じ感情を持っているが、過去10年間多くのJavaScriptを実行したC ++ / C#プログラマーとして、最初の推奨事項はVisual Studio Codeを試してみることです。

もちろん、厳密に型指定された言語で追加できるすべての機能を提供できるわけではありませんが、かなり近いものです。

また、typescriptから型情報を取得してJavaScriptに適用することもできます。typescriptを使用したことがない場合でも、JavaScriptで入力すると、コード補完と大量のAPIに関するドキュメントを取得できます。

あなたの質問に

  • 関数のエントリポイントをすぐに見つける方法はありません(プレーンテキスト検索では、呼び出し階層のさらに上のメソッドの検索が行われる可能性があります。

VSCodeでほとんど解決されているようですか?

  • パラメーターは関数に渡されますが、そのパラメーターで使用可能なプロパティと関数を知る方法はありません

これは、JSDocスタイルのコメントまたはtypescriptを使用してコードを文書化することにより、多くのIDEで解決されます。編集者はコメントを読んで、あなたが慣れているのと同じ完成度をあなたに与えます

コールバックとしての匿名関数の一般的な使用法は、しばしば混乱するコードパスのスパゲッティにつながり、すぐに移動することはできません。

C#プログラマとして、匿名関数も同様に一般的であり、C ++に追加されています。これはあなたが慣れなければならないものだと思います。

また、コールバックは主にpromiseとasync / awaitに置き換えられていますが、コールバックを使用するapiがある場合は、すぐにラップしてpromiseを使用し、async / awaitを使用して問題を解決できます。

確かに、JSLintは実行前にいくつかのエラーをキャッチしますが、それでも、ブラウザーでコードの下に赤い波線を表示するほど便利ではありません。

Visual Studio Codeに波線が表示されます。それだけでなく、ESLint統合を有効にすると、エディターで強調表示された驚くべき警告やエラーが大量に発生します。他の言語で実際に見た以上のもの。私の経験では、C / C#/ Javaのリンターはかなりハードコーディングされています。ESLintは非常に構成可能で拡張性が高いため、人気のあるライブラリーを統合して、エディターでの特定のライブラリー使用に関するアドバイスや警告を提供することもできます。私が他の言語で個人的に見たことのないもの(他の言語でも一般的になっているかもしれませんが?)

また、2018年であり、ES7が新しい標準になりましたclass。常に厳格モードを使用します。あなたは決して使用しないvarと、常に使用constし、letC ++ / C#/ Javaプログラマが消えるの種類に慣れる苦労していたことや物事の束。電源をオンにしno-undefESLint内のルール、さらに問題が消えます

つまりthis、C ++ / C#/ Javaとは異なるため、実際にどのように機能し、関数とメソッドが実際にどのように機能するかを学びます。

JavaScriptの私の最初の2〜3年は私がイライラしていた。ある時点でクリックしました。強制的にC ++ / C#/ Javaにしようとするのをやめ、JavaScriptで15行かかるものが他の言語で150行かかるといらいらするようになりました。


-1

IDEが好きで、Eclipseに慣れている場合は、AptanaをJavaScriptのIDEとして確認してください。私はそれがあなたが望むものの多くを行うことができると思います。(私は個人的にIDEが嫌いですが、それは別の会話です)。

匿名関数については、JavaScriptで最も強力な機能であり、それらを持たない言語で作業しようとすると、この時点で非常に苦痛です。

JavaScriptにコンパイルできる他の何かが必要な場合、多数のオプションがあります。CofffeeScript、Clojure、GWTはすべて思い浮かびますが、他にもあります。


2
私は一度Aptanaを試しましたが、それは本当に悪いです。自動インデントさえありません。同じプロジェクトでEclipseとAptanaを使用している場合、他のEclipseエディターによって設定されたすべてのプロジェクト設定(カラーリングなど)が破棄されます。
ジョナス

1
私はしばらくの間、それを使用して、それを嫌って、私は、私はIDEのを嫌い言ったように私は(私がやっているものに応じて)GVIMやemacsでコマンドラインツールや編集によって書式設定します
ザカリーK

最初の数時間でクラッシュし、ほんの一握りのファイルしか開いていませんか?さようなら。
エリックReppen

Webstormは悪くありません。私はまだほとんどの場合Sciteを使用していますが、Node.jsのことを書くときにIDEのことをもっと感じ始めており、目に見えるブラウザのフィードバックと開発ツールの利点がありません。
エリックレッペン

-1

私はまだ自分で使っていませんが、いくつかのデモを見てきましたが、JavaScript IDEとしてのCloud 9には非常に感銘を受けました。

両方のオンラインサービスモデルにアクセスするか、GitHubからダウンロードできます。

IDEとしての品質の証拠として、Cloud9は... Cloud9を使用して書かれました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.