9

コンピューター エンジニアリングの勉強を始める前は、Rails (それ以前は PHP) で多くの Web プログラミングを行っていました。

それ以来、私は C で多くの学業を行い、Objective-C (Mac のもの) でいくつかの個人的なことをしました。静的型付けが好きになりました。

しかし今、私はプロの Web 開発 (フリーランス) を行う必要があり、Rails を再び手に入れました。非セマンティックな型チェック テストを作成するのは非常に面倒です。私はそれらを C および Objective-C コンパイラから無料で入手していました。Build を押して、システムにすべてのコードをチェックさせて、A が B を呼び出すことができるか、B が不明なライブラリ C を呼び出すことができるかなどを確認するのが好きでした。私がしなければならなかったのは、セマンティクスをテストすることだけでした。しかし、Rails では、私がコンパイラです。:(

誰かがこれと同じ道を歩んだことがありますか? C# と Java + x フレームワークを使用した Web 開発 ASP.NET MVC の唯一のオプションですか? いくつかの提案、または同情さえ探しています... :P

ちなみに、Ruby ではなく Rails に具体的に言及するのは、Ruby の動的な性質が、スクリプト作成などの単純な作業で問題にならないからです。しかし、Rails は非常に多くの gem に依存しており、通常は 1 つの gem が他の多数の gem を追加するため、動的型付けが問題になります。

ありがとう!

編集:

私はpstの提案をフォローアップし、Scalaを調べました。言語の作成者である Martin Odersky によって書かれた本 Programming in Scala を読んでいるときに、さまざまな方法で私の懸念とそれ以上のことを表現しているこのテキストに出くわしました。非常に興味深い読書。

Martin Odersky の Programming in Scala の 52 ページから引用:

Scala は静的に型付けされています

静的型システムは、保持および計算する値の種類に従って、変数と式を分類します。Scala は、非常に高度な静的型システムを備えた言語として際立っています。Java によく似た入れ子になったクラス型のシステムから始めて、型をジェネリックでパラメーター化し、共通部分を使用して型を結合し、抽象型を使用して型の詳細を隠すことができます。これらは、独自の型を構築および構成するための強力な基盤を提供するため、安全で柔軟に使用できるインターフェイスを設計できます。

Perl、Python、Ruby、Groovy などの動的言語が好きな人は、Scala の静的型システムが長所の 1 つとして挙げられていることに少し違和感を覚えるかもしれません。結局のところ、静的型システムがないことは、動的言語の主な利点として挙げられています。静的型に対する最も一般的な議論は、プログラムが冗長になりすぎる、プログラマーが自分自身を思い通りに表現できない、ソフトウェア システムの動的変更の特定のパターンを不可能にする、というものです。

ただし、多くの場合、これらの引数は一般的な静的型の考え方に反するものではなく、冗長すぎるか柔軟性がないと認識されている特定の型システムに反します。たとえば、Smalltalk 言語の発明者である Alan Kay はかつて次のように述べています。 /p>

この本で、Scala の型システムが「完全な苦痛」とはほど遠いことを納得していただけることを願っています。実際、静的型付けに関する通常の 2 つの懸念事項にうまく対処しています。型推論によって冗長性が回避され、パターン マッチングといくつかの新しい方法で型を記述および構成することによって柔軟性が得られます。これらの障害が取り除かれると、静的型システムの従来の利点をよりよく理解できるようになります。これらの利点の中で最も重要なものは、プログラムの抽象化の検証可能なプロパティ、安全なリファクタリング、およびより優れたドキュメントです。

検証可能なプロパティ

静的型システムは、特定の実行時エラーがないことを証明できます。たとえば、次のようなプロパティを証明できます。ブール値は整数に追加されることはありません。プライベート変数はクラス外からアクセスされません。関数は正しい数の引数に適用されます。文字列のセットに追加されるのは文字列だけです。

他の種類のエラーは、今日の静的型システムでは検出されません。たとえば、それらは通常、非終了関数、配列境界違反、またはゼロ除算を検出しません。また、プログラムがその仕様に準拠していないことも検出しません (仕様があると仮定します)。そのため、静的型システムはあまり有用ではないとして却下されてきました。そのような型システムは単純なエラーしか検出できないのに対し、単体テストはより広範なカバレッジを提供するため、なぜ静的型を気にする必要があるのでしょうか?

私たちは、これらの議論は的を射ていないと考えています。静的型システムは確かに単体テストに取って代わることはできませんが、そうでなければテストする必要があるいくつかのプロパティを処理することで、必要な単体テストの数を減らすことができます。同様に、単体テストは静的型付けに取って代わることはできません。結局のところ、Edsger Dijkstra が言ったように、テストはエラーの存在を証明することしかできず、エラーがないことを証明することはできません。したがって、静的型付けが提供する保証は単純かもしれませんが、どれだけのテストを行っても提供できないフォームの実際の保証です。

安全なリファクタリング

静的型システムは、コードベースを高い信頼度で変更できるセーフティ ネットを提供します。たとえば、メソッドに追加のパラメーターを追加するリファクタリングを考えてみましょう。静的に型付けされた言語では、変更を行い、システムを再コンパイルして、型エラーの原因となっているすべての行を単純に修正できます。これが完了したら、変更が必要なすべての場所を確実に見つけることができます。同じことが、メソッド名の変更やクラス間でのメソッドの移動など、他の多くの単純なリファクタリングにも当てはまります。すべての場合において、静的型チェックは、新しいシステムが古いシステムと同じように機能することを十分に保証します。

ドキュメンテーション

静的型は、コンパイラによって正確性がチェックされるプログラム ドキュメントです。通常のコメントとは異なり、型注釈が古くなることはありません (少なくとも、それを含むソース ファイルが最近コンパイラに渡された場合はそうではありません)。さらに、コンパイラと統合開発環境は、型注釈を利用して、より優れたコンテキスト ヘルプを提供できます。たとえば、統合開発環境では、選択が行われる式の静的タイプを判別し、そのタイプのすべてのメンバーを検索することにより、選択に使用できるすべてのメンバーを表示できます。

4

3 に答える 3

7

これは、動的言語に関する私の「不満」の 1 つです。型エラーではなくセマンティクスをテストしたい ;-) そうは言っても、優れたテスト フレームワーク/セットアップは、すべての重要な状況で本当に必須であり、優れたコード カバレッジとテスト済みの要件が重要です。

JVM (私が持っています) で static-typing パスをたどりたい場合は、Scalaを見ることを強くお勧めします。Ruby からの移行は、Java への移行よりもはるかに苦痛が少ない (実際、さまざまな点で多くの楽しみがあります)。当然のことと思っていることを「維持」できます。式ベースの構文、クロージャー、多くの場所で型を省略できる機能 (Ruby ほどオープンではありませんが、コンパイル時の型チェックが可能です ;-)、 everything(*)-is-an-object OO、統一されたアクセサ メソッド、DSL を簡単に構築する機能、およびシュガー - ローカル型推論、パターン マッチング、比較的豊富なコレクション フレームワーク、およびJava との適切な統合 (多数の Web フレームワークを含む。Scala 言語を活用する Scala 固有のフレームワークもいくつかあります)。

C#3.0/4.0 (および .NET3.5+) もそれほど粗末ではありません(ただし、C#2.0 は避けてください。C#2.0 は現在遺物であることが望まれます)、LINQ/クロージャー、基本的な型推論、およびその他の優れた言語機能が導入されています。ほとんどのタスクで「許容できる」と思います (Java を言語としてどのように評価するかを推測してください ;-)。ただし、C# は CLR ターゲット言語です (.NET Scala への移植はありますが、.NET Scala への移植があったかどうかはわかりませんが、主要なターゲット プラットフォームではありません)。

Scala について言及したので、OCaml に似た「OO を使用した機能」アプローチを取る F# (現在は「公式」.NET 言語) についても言及する必要があります。Scala は逆であり、「OO」と表現します。機能付き」。型システムに関して C# と比較して F# に賛成/反対の議論を聞いたことがありますが、F# の実際の経験はありません。パラダイムシフトが好きかもしれないし、嫌いかもしれない。

ハッピーコーディング。

于 2010-12-07T22:42:56.050 に答える
2

Railsについて言及しているように、そしてScalaに興味を持っていることを考えると、Liftを必ずチェックする必要があります。これは、その作成者への2008年のインタビューと、2009年のプレゼンテーション(ビデオ)です。これは、古いものの、Liftを他の言語の代替言語と比較しているためです。

ただし、Liftがあなたのものでない場合は、他のScalaWebフレームワークがあるので安心してください。

于 2010-12-08T16:07:13.360 に答える
1

通常、この種のテストは Rails では行われません。やらなければならないことにイライラするのではなく、気にしないことを考えてください。または、ほとんどの Rails プログラマーはそうしないので、それが問題だと思う理由を説明するより良い仕事をするかもしれません。

アップデート

書いた人test_include_with_order_worksは、Rails がこの特定のケースでシンボルを文字列と同じように解釈することを確認しています。Rails はすでにこの機能を提供してテストしているので、これはテストする必要がないように思えます。率直に言って、シンボルが文字列のように機能するかどうかを心配する人がいることに少し驚いています。私たちは皆、それが可能であり、しばしばそうであることを知っています.

一般に、Rails フレームワークは、その実装がその設計に適合するように、ユーザーが保証しないことを保証する必要があると思います。動的型付け言語の作業哲学は、クライアント コードが呼び出しているメソッドを破壊するパラメーターを渡さないということだと私は信じています。その場合、メソッドを呼び出しても役に立ちません。メソッドが余分なパラメーターを無視するのと同じくらい簡単にできる (そしてそうすべきである) 場合、提供されたパラメーターが多すぎるときにメソッドが例外をスローすることを確認するために時間を無駄にする必要はありません。

したがって、あなたが提供した例が、Rails での非セマンティック テストの必要性を本当に示しているかどうかはわかりません。

于 2010-12-07T17:37:50.587 に答える