質問

静的/厳密に型指定されたプログラミング言語の最も貴重な点は、次のようなリファクタリングに役立つことだと私には思われます。API を変更した場合、コンパイラはその変更によって何が壊れたのかを通知します。

ランタイム/弱い型指定言語でコードを書くことは想像できます...しかし、コンパイラの助けなしでリファクタリングすることは想像できませんし、リファクタリングなしで数万行のコードを書くことも想像できません。

これは本当ですか?

役に立ちましたか?

解決

私はタイプは、彼らがチェックしているかを確認しているときにconflatingていると思います。ランタイムタイピングは必ずしも弱くないです。

静的タイプの主な利点は、あなたが言うまさにです:彼らはすべてを網羅しています。あなただけのコンパイラをさせることにより、すべての呼び出しサイトがタイプに適合確信することができ、それはことだ行います。

静的な種類の主な制限は、彼らは、彼らが表現できる制約に制限されていることです。これは、ほとんどの言語は非常に強力な型システム(ハスケル、カイエン)で、比較的簡単な型システム(C、Java)の、そして他の人を持って、言語によって異なります。

この制限のため、独自の種類は十分ではありません。たとえば、Java型に多かれ少なかれタイプ名が一致を確認するに制限されています。これは、あなたがチェックしたい任意の制約の意味は、したがって、ある種の命名スキーム、間接およびJavaコードに共通するボイラープレートの過多にエンコードする必要があることを意味します。 C ++は、もう少し表現を許可するテンプレートがありますが、依存型で何ができるかの近くに来ていないという点で少し良いです。明らかに、いくつかのまたはより多くの人々は、業界でそれらを使用することになるがなければならないけれども、私は、より強力な型システムに欠点が何であるかわからない。

あなたは静的型付けを使用している場合でも、チャンスはそれはあなたが気にすべてをチェックするのに十分な表現力ではないのですが、あなたはあまりにもテストを記述する必要があります。静的型付けはあなたにそれが定型で必要とするよりも大きな労力を節約するかどうかは、年齢のために、私はすべての状況に簡単な答えを持っているとは思わないことを激怒だ議論されます。

あなたの2番目の質問については:

どのように我々は、実行時型付けされた言語で安全ファクタを再することができますか?

答えはテストです。あなたのテストは重要ではすべてのケースをカバーしなければなりません。ツールは、あなたのテストはどのように徹底的測るのお手伝いをすることができます。カバレッジチェックツールを使用すると、コードの天気を行がテストやないで覆われている知っています。テスト変異ツール(道化師、野次る)は、あなたのテストは、論理的に不完全である場合、あなたが知っていることができます。受け入れテストは、あなたがマッチの要件を書いたものを知ってみましょう、そして最後に回帰し、パフォーマンステストは、製品の新バージョンは、最後の品質を維持していることを確認します。

手の込んだ型間接に頼る対の場所に適切なテストを持っていることについての素晴らしいことの一つは、デバッグがはるかに簡単になることです。テストを実行するとき、あなたは明らかに鈍角コンパイラエラー文は(++テンプレートエラーcを考える)のではなく、彼らが何をやっている表現のテスト内の特定の失敗したアサーションを取得します。

どんなにあなたが使用しているものツール:書いたコードは、あなたの努力が必要になりますに確信しています。これは、最も可能性の高い多くのテストを書く必要があります。バグのペナルティは、航空宇宙や医療制御ソフトウェアとして、の非常にの高い場合、あなたは、このような開発は非常に高価になり、あなたのソフトウェアの動作を証明するために正式な数学的手法を使用する必要があります。

他のヒント

私は完全にあなたの感情に同意します。動的型付け言語が得意ことになっている非常に柔軟性が維持するために、コードは非常に困難にするものである、実際に。本当に、データ型は非自明な方法で変更された場合、実際にコードを変更せずに作業を続けてプログラムのようなものがあるのでしょうか?

平均時間では、渡される変数の型をチェックし、何とかその期待できないタイプの場合は失敗する可能性があります。あなたはまだ、これらの例を根絶するために、あなたのコードを実行する必要があるだろうが、少なくとも何かがあなたを言うだろう。

私はGoogleの内部ツールが実際にコンパイルを行うと、おそらく彼らのJavaScriptに型チェックだと思います。私はこれらのツールがあればいいのに。

まず、私はネイティブ Perl プログラマーなので、静的型のネットを使ってプログラミングしたことがありません。OTOH 私は彼らと一緒にプログラミングしたことがないので、彼らの利点について話すことはできません。私が話せるのは、リファクタリングとはどのようなものかということです。

静的型がないことがリファクタリングに関して問題になるとは思いません。問題はリファクタリングがないことです ブラウザ. 。動的言語には、コードを実際に実行するまでそのコードが実際に何をするのかわからないという問題があります。Perl にはこれがほとんどの場合よりも多く備わっています。Perl には、非常に複雑でほとんど解析不可能な構文があるという追加の問題があります。結果:リファクタリングツールはありません(ただし、 彼らはそれに非常に迅速に取り組んでいます)。最終的には手動でリファクタリングする必要があります。そしてそれがバグをもたらすのです。

彼らを捕まえるためのテストがある...いつもの。私は、テストするためにコードをリファクタリングしなければならないが、リファクタリングするためにはテストしなければならないという鶏が先か卵が先かという問題を抱えた、テストされていない、またはテスト不可能に近いコードの山の前にいることがよくあります。いやー。この時点で、何かを壊していないことを確認するために、非常に愚かで高レベルの「プログラムが以前と同じことを出力するかどうか」のようなテストを作成する必要があります。

Java、C++、または C# で想定されている静的型は、実際には少数のプログラミング問題のみを解決します。これらは、インターフェイスに正しいラベルが付いたデータビットが渡されることを保証します。ただし、コレクションを取得したからといって、そのコレクションに、あなたが想定しているデータが含まれているとは限りません。整数が得られたからといって、正しい整数が得られたとは限りません。メソッドは User オブジェクトを受け取りますが、その User はログインしていますか?

典型的な例: public static double sqrt(double a) それは Java 平方根関数のシグネチャ. 。平方根は負の数には機能しません。署名のどこにそう書いてありますか?そうではありません。さらに悪いことに、その機能が何をするのかはどこに記載されているのでしょうか?署名には、どのような型を受け取り、何を返すかだけが記載されています。その間で何が起こるかについては何も述べていませんが、そこに興味深いコードが存在します。を使用して完全な API をキャプチャしようとした人もいます。 契約による設計, これは、関数の入力、出力、および副作用 (またはその欠如) の実行時テストを埋め込むこととして広く説明できます...しかし、それは別のショーです。

API は単なる関数シグネチャをはるかに超えており (そうでない場合、Javadoc に説明的な散文は必要ありません)、リファクタリングは単に API を変更するよりもはるかに均等です。

静的に型付けされ、静的にコンパイルされた非動的言語がもたらすリファクタリングの最大の利点は、メソッドへのすべての呼び出しがどこにあるかを認識しているため、非常に複雑なリファクタリングを実行するリファクタリング ツールを作成できることです。かなり羨ましいです インテリJアイデア.

私はリファクタリングも静的型付け言語では、コンパイラがチェックすることができるものを超えたと言うでしょう。リファクタリングは、単に外部の行動に影響を与えることなく、プログラムの内部構造を変化させています。でも、動的言語では、あなたは、あなただけのコンパイラからの支援の少しを失うために起こるとテストを期待できることが残っています。

のVAR の中にC#3.0を使用する利点の1つは、あなたがは、多くの場合、任意のコードを壊すことなくタイプを変更することができます<全角>ということです。タイプはまだ同じに見える必要がある - 同じ名前のプロパティが存在している必要があり、同一または類似のシグネチャを持つメソッドがまだ存在している必要があります。しかし、あなたは本当にも、ReSharperのようなものを使用せずに、非常に異なるタイプに変更することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top