2

この回答は、動的言語と静的言語 (好みに応じて、通知または変形された私の視点) でパラメーターの型を処理する方法について、私が理解できなかったことに神経質になりました。

動的言語でパラメーター bar を受け取るメソッド foo が与えられた場合、コンパイル時に bar の型が強制されることはありません。上記のリンクされた回答 (および私がこれに対して一般的に見た回答) は、動的言語で適切に単体テストを行う必要があるということです。

しかし、ある時点で、ユニット外の何かがそのメソッドを呼び出します。これは、それを使用するクラスの単体テストでモックされる重いオブジェクトであるとします。このメソッドを呼び出すクラスが多数あるため、型を変更する必要があります。簡単にするために、以前は数値を取っていましたが、現在は英数字が必要です。新しい要件では、数値オブジェクトではなく、文字列に対して特別に使用できるメソッドを使用する必要があります。

どのように変更し、呼び出しコードが修正されることを知っていますか? 確かに変更しただけでは単体テストは失敗しますが、意図的に変更する必要があるため、表向きは単体テストを修正することになります。呼び出しコードを修正する方法をどのように知っていますか? 概念的にどれだけ知っているかだけでなく、すべての呼び出し元を見つけて、それが変更されたと本当に言えるかをどのように知っているかを意味します。

非常に包括的な統合テストだけがその保証を与えるように思われます。何か不足していますか?

4

6 に答える 6

2

投稿するには 15 文字必要ですが、答えは 4 文字です: grep.

于 2009-09-25T02:29:44.763 に答える
2

静的型付けの利点の 1 つの優れた具体例を示したと思います。動的型付けでは、これらすべての呼び出し場所を自分で見つける必要があります。ただし、これは実際にはそれほど難しくありません。コード内のテキスト検索にすぎません。それはトレードオフです: コンパイラがコードを相互参照し、すべてが一致することを確認できるという快適さと、コード全体に気を散らす型タグがないことです。

于 2009-09-25T02:31:36.493 に答える
2
  1. 防御的にコーディングします。新しいメソッドで下位互換性のある変更を行います。引数の型でディスパッチします。CLOSはこれを簡単にします。

  2. エディタまたは IDE の「呼び出し元」機能を使用します。

于 2009-09-25T02:32:57.083 に答える
1

これは、単体テストの質問というよりもリファクタリングの質問のようです。

パラメータは、特定の関数で必要なすべてのプロパティとメソッドが存在し、期待される結果を返すことを保証することにより、効果的に単体テストされます。タイプではなくインターフェースが重要です。

于 2009-09-25T02:30:38.457 に答える
1

簡単な答えは、「ユニットテストをずっと上に置く」だけです。

重要なのは、新しい型にも必要なメソッドがあることだけです。そのため、param を受け取って呼び出すClassAMethod1() がある場合、および- obj に対する唯一の制約は、これらのメッセージに応答することです。以前は存在しなかったメソッドを呼び出すように実装を変更すると、クラス A を実行するテストが失敗します。objobj#M1()obj#M2()Foo()

次に、その機能の一部として ifClassB呼び出しA#Method1()を行うと、クラス B が必要なメソッドを持つ obj を渡している場合、そのテストは失敗します。B の必要な動作が達成されない場合、そのテストは失敗し、B で必要な変更に向けられる必要があります。

于 2009-09-25T02:30:43.263 に答える
1

動的言語の開発者は、静的型付けの利点を再現する必要があります。つまり、そのツールでそれらのエラーを自動的に検出できるようにする必要があります。ほとんどの場合、これには型推論ツールが関係します。推論自体はかなり難しいですが (私は PHP での推論について博士号を書いています)、ツールの使用はそれほど難しくありません。

次のエラー検出ツールがあります。

PHP の場合、phcは非常に少量の作業でこれを行うことができます。

全体として、静的型付けがない場合、利点を得るにはツールが必要です。

于 2009-09-30T11:34:59.357 に答える