2012-09-02 24 views
9

関数をどこにでも使用する前に関数を記述している場合、その型の注釈をそのパラメータに追加すると便利です。つまり、私はその値をオートコンプリートすることができ、(特にF#newbieとして)予期しない型推論によって混乱することはありません。リファクタリング時にF#の注釈を削除する必要がありますか?

しかし、いったん関数が終了すると、パラメータの型の注釈が醜いので削除するようにしたいと思います。これは妥当なもののように聞こえるか?

私は、私が話している機能の種類に依存すると思う。例えば、私的な機能には意味があるかもしれませんが、公共の機能には意味がないかもしれません。

答えて

6

私はそれが多くの要因に依存すると思います。注釈を残すことを支持するいくつかの議論があります:

  1. 型注釈は、おそらくコンパイラがチェックしたドキュメントの一種として役立つことがあります。
  2. 正当な理由がなく作業コードを変更しないでください。
  3. コンパイルにはいくつかのタイプの注釈が必要な場合があります。その場合、一貫性のために不要なものだけを削除するのではなく、すべてを残しておくのがよいでしょう。

しかし、一方で、また、それらを除去するために、いくつかの説得力のある理由があります:

    コンパイラは、実際にはより広範な一連の機能を再利用することができ、その場合には、より一般的なタイプを、推論することができる
  1. 文脈
  2. あなたのコードはより簡潔になり、より読みやすくなります。何が価値があるために
2

いいえ、それに利点はありません。後でプログラムを変更しやすくするか、見た目は良くなると言えますが、実際には決してうまくいかないでしょう。

ほとんどの場合、最初にアノテーションを追加したのとまったく同じ理由で、アノテーションを再入力することになります。

0

これは個人的なスタイルの問題です。私はそれらを取り出すだろう。 F#のコーディングがうまくいくにつれ、注釈フェーズをあまり頻繁に行わなければならない場合があります。

4

、私の個人的なスタイルは、FSIファイルを使用してパブリックモジュールインターフェイスの注釈を維持し、(それらは左から右への型推論によって必要とされない限り)FSモジュールの実装ファイル内のほとんどの注釈を消去することです。このスキームでは、モジュールのインターフェースを変更することは大変なことであり、実装を変更することはあまりありません。

2

ここで重要な議論は、型の注釈を削除すると、ソースの意味が変更されることです。

実際、ソースコードがあるとします。let f (arg: MyType) = arg.ToString()です。
ソースでargのタイプがMyTypeに制限されています。クライアントコードが別の型の引数を渡そうとすると、単純にコンパイルされません。
これはユニットテストにも当てはまります。型注釈では、すべての単体テストがMyTypeの型の引数でのみfを呼び出すのは簡単です。

型注釈が削除される場合は、無制限の型推論の仕事が、テストの準備ができていない、彼らはまだのみMyTypeでそれをテストし

したがって、型の注釈を削除することは、ユニットテストを他のリファクタリングの変更と関連付ける必要があります。テストを改善する準備ができている場合は、テストを進めてください。それ以外の場合は、特に大規模なコードベースの場合、問題を尋ねている可能性があります。

+0

これは本当に興味深いことですが、私はTDDの観点からは考えていませんでした。最初にテストを書くことは、私が自分自身を助けたいときに注釈を付ける必要はないことを意味します。 – Geoff

関連する問題