典型的な「動的言語の間違い」を回避する方法は?


42

私は最近、膨大なユーザーベースから利益を得たいと思ったため、JavaScriptに数時間を費やしました。そうすることで、ほとんどの人が動的言語に起因するパターンに気付きました。物事は本当に迅速に機能しますが、コードが特定のサイズに達すると、一般的にタイプ、スペル、リファクタリングのエラーで多くの時間を無駄にします。コンパイラが通常私を免れるエラー。また、別のモジュールでタイプミスをしたばかりのときに、ロジックのエラーを探す必要はありません。

JavaScriptや他の動的に型付けされた言語に続く信じられないほどのことを考えると、私のアプローチに何か問題があると信じるようになりました。または、これはあなたが支払わなければならない価格ですか?

もっと簡潔に言うと:

  • 〜2000 LOCでJavaScript(またはその他の動的言語)プロジェクトにどのようにアプローチしますか?
  • これらの間違いを防ぐためのツールはありますか?私はFacebookとJSHintによるフローを試みましたが、これは多少役立ちますが、タイプミスはキャッチしません。

2
コストを軽減する方法はありますが、コストあります
dcastro

29
Typescript、Scala.js、Elmなど、javascriptにコンパイルされる静的に型付けされた言語でプログラムを作成してみます。
dcastro

6
テスト、テスト、追加テスト、カバレッジレポート。
njzk2

7
〜2000 LOCは小さなプロジェクトです。動的言語が簡単かつ適切に実行するものに簡単に適合する必要があります。そのような規模のプロジェクトに苦労している場合、動的言語に特に関連するものよりもプログラミングスキルに根本的な問題があります。
ジャックエイドリー

5
@JackAidley同意しませんでした。OPは、識別子のスペルが正しいかどうかではなく、高レベルの問題に焦点を当てるために使用されます。それがプログラミングスキルです。中学年生および/またはツールのサポートにより、正しいスペルを確認できます。
ムカホ

回答:


37

特にJavaScriptについて言えば、代わりにTypeScriptを使用できます。それはあなたが言及しているもののいくつかを提供します。ウェブサイトの引用:

型を使用すると、JavaScript開発者は、JavaScriptアプリケーションの開発時に、生産性の高い開発ツールと静的チェックやコードリファクタリングなどのプラクティスを使用できます。

そして、これはJSの単なるスーパーセットです。つまり、既存のコードの一部はTSで問題なく動作します。

TypeScriptは、何百万ものJavaScript開発者が今日知っているのと同じ構文とセマンティクスから始まります。既存のJavaScriptコードを使用し、一般的なJavaScriptライブラリを組み込み、JavaScriptからTypeScriptコードを呼び出します。


11
...と活字体は、本質的にはECMAScript 6である
ロバート・ハーヴェイ

11
ええ、その引用は痛いです。これは、Microsoftが常に動的言語を単純に理解していない静的言語企業であることを示しています。「タイプは…コードのリファクタリングを可能にしますか?」本当に?MicrosoftのPR部門は、実践としてのコードリファクタリングがSmalltalk(動的言語)で発明され、その前にForth(型なし言語)でも存在していたことを認識していますか?静的言語は前であっても非常に最初の自動化されたリファクタリングツールは、SmalltalkのIDEの一部であったということだったのIDEを?最新のSmalltalk IDEには、少なくともJava、C#、C ++と同じくらい強力なリファクタリングツールがありますか?さあ
ヨルグWミットタグ

5
TypeScriptはそれ自体素晴らしい言語ですが、なぜそんなナンセンスでそれを試してプッシュする必要があるのですか?
ヨルグWミットタグ

29
@JörgSmalltalkについては十分に知りませんが、私が見たJavaScriptまたはPythonのIDEはどれも、JavaまたはC#の優れたIDEができることの何マイルも遅れています。また、動的言語では不可能なこともいくつかあります(実際に最も一般的なリファクタリングの一部):パブリック関数foo(x) { return x.bar;}またはそのようなものがあるとします。型情報がなく、関数がパブリックであるため(すべての呼び出し元を知ることができないため)、クラスの名前を変更した場合、barの名前をbazに変更する必要があるかどうかを判断することはできません。
Voo

10
この答えは、「動的言語の間違い」の解決策は、動的言語をまったく使用しないことだと言っています。
-bgusach

19

役立つアプローチがいくつかあります。

単体テスト

可能な場合は単体テストを作成します。手動でのテストに頼るだけ、または野生のバグを見つけるのは当たり前です。

フレームワークを使用する

独自に展開してバグを導入するリスクを負うのではなく、可能な場合は確立されたフレームワークを使用してください。

CSS /高級言語を好む

CSSに機能を委任できる場所、または記述している高水準言語。

リファクタリング

コードの量を減らすためにリファクタリングします。少ないコード=物事がうまくいかない場所が少なくなります。

再利用

既存のコードを可能な限り再利用します。コードが完全に一致していなくても、新しく何かを書くよりも、コピー、貼り付け、修正する方が良い場合があります。

IDE

一般に、最新のIDEには少なくともいくつかのJavaScriptサポートがあります。一部のテキストエディターもJavascript対応です。


5
本当ですが、あなたのアドバイスは基本的にすべてのプログラミング言語に適用され、主に動的言語から生じるものではなく論理的な間違いを修正することを目的としています。
edmz

1
「あなたのアドバイスは、すべてのプログラミング言語に基本的に適用されます」。非常に真実-趣味のプロジェクトから完全なファットエンタープライズソリューションへのギアを通過するのと同様の方法で、同様に増加する量の制限を必要とします-同様に書かれたJavascriptが多いほど、ホイールが行かない場合はより多くの規律が必要です急速に外れます。Eric Lippertはこれを非常によく説明しています。
ロビーディー

4
「CSS /高級言語を好む」 — JavaScriptに関連してこのビットが何を意味するのか本当に理解していません。要素(アニメーションなど)をJSコードではなくスタイルシートに移動すると言っていますか?CSSは高級言語とどのように関係していますか?
-anotherdave

@anotherdave Javascriptのドメインであったことの多くは、CSS3で実現できるようになりました。一部の機能は、より厳格な制御の対象となる上位レベルの言語に移動することもできます。
ロビーディー

4
@anotherdave JavaScriptで実行しようとすることの多くは、無関係で不適切です。標準言語ツールを提供するライブラリ、標準HTML要素をもう少し提供するフレームワーク、アンカー、MVCエミュレーション、スタイリング、DOM再実装、AJAX抽象化、単純なオブジェクトのレンダリング(SVGの再実装)などの基本機能を複製するコード、ユーザーに利益をもたらす…書くJSの量を最小限に抑える必要があります。JSなしで実行できる場合は、JSなしで実行してください。
bjb568

2

まだ言及されていないツールの 1つは、単純なファイルローカルまたはプロジェクト全体のテキスト検索です。

簡単に聞こえますが、いくつかの正規表現を含めると、ドキュメントやソースコードにある単語の検索など、基本から高度なフィルタリングを実行できます。

私にとっては(静的アナライザー以外に)有効なツールであり、プロジェクトのサイズが2k LOCであると考えると、私の意見ではそれほど大きくありませんが、うまくいけば驚異的に動作するはずです。


2
grep長い道のりを歩みます。あなたがあまりにも奇妙な動的なことをしない限り、それはトリックを行います。ただし、静的型付き言語のIDEに慣れている場合は、非常に手間がかかります。
-bgusach

1

現在、大規模なAngularJSプロジェクトで数千行のコードをリファクタリングしています。最大の問題の1つは、特定の関数の正確なコントラクトを把握することです。生のAPIレスポンスの要素は、修正される前に6層のコードを通過し、さらに6層のコードを経由して返される変数に割り当てられたため、時々APIドキュメントを読むことになりました。

私の最初のアドバイスは、契約によって設計することです。TypeScriptまたは少なくともJSDocを使用して、特定の入力を取得し、特定の出力を生成し、副作用を回避し、それらの期待を文書化します。

2つ目のアドバイスは、できるだけ多くのチェックを実装することです。AirBnB標準に従い、コードベース全体でeslintを使用します。コミットフックは、常に標準に従っていることを確認します。一連の単体テストと受け入れテストが自然にあり、すべてのコミットはピアによってレビューされる必要があります。

また、テキストエディター(Sublime Text)から適切なIDE(WebStorm)に切り替えることで、一般的なコードの操作がはるかに簡単になりました。WebStormはJSDocを使用して、予想されるパラメータータイプに関するヒントを提供し、間違ったタイプを指定した場合や、誤った方法で戻り値を使用した場合にエラーを発生させます。

JavaScriptでは、シンボルやゲッター/セッターなどの新機能は、変数の割り当てにアサーションを追加することで特定のレベルの品質を強化するのに役立ちます(たとえば、整数が範囲内であること、データオブジェクトに特定の属性があることを確認します)。

残念ながら、動的な言語の間違いを防ぐ真の解決策はないと思います。頻度を減らすのに役立つ一連の対策だけです。


0

「〜2000 LOCでJavaScript(またはその他の動的言語)プロジェクトにどのようにアプローチしますか?」という質問に対する私の答え

PDFフォームアプリケーションを開発しています。ペトリのネット要素と注釈を使用して、JavaScriptソフトウェア開発プロジェクトに(ソースコードのサイズに関係なく)アプローチします。このメソッドは、特定のプログラミング言語テクノロジーに関連付けられていません。したがって、他の「プログラミング言語」に使用できます。

アプリケーションロジックの図を作成します。図を整理するために、図で使用するフォームにほとんどの注釈を追加します。フォームのエントリには、プロパティまたは関数への参照が含まれます。次に、図の情報とフォームのエントリに基づいてソースコードを記述します。記述されたすべてのソースコードは、フォームの図とエントリから直接マップされるため、この方法は体系的です。ソースコードは、コードを記述するときに命名規則とコーディング規則にも従うため、簡単に確認できます。

たとえば、すべての関数がプロトタイプであるという規則を選択しました。パフォーマンスが問題になる場合は、コンストラクターで関数を宣言することで改善できます。一部のプロパティでは、配列を使用します。また、パフォーマンスが問題になる場合は、直接参照を使用して改善できます。

evalも使用します。これにより、ソースコードのサイズを大幅に削減できます。パフォーマンスの問題のため、アプリケーションの開始部分または初期化部分でevalを使用しています。「ランタイムロジック」では使用しません。これは、私が従うもう1つのコーディング規則です。

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