2013-04-01 15 views
8

(私は「ワークフロー」という言葉を使用しています - 非同期ワークフローという意味ではなく、むしろ開発の一環としてどのように使用するかという「git workflow」という意味です)F#ワークフロー/開発プロセス

しばらくF#で遊んでいたので、最初のF#アプリを開発し始めました。私はc#/ vbから来た。さまざまなデモや会話を見てきました - 間違いなく - 私はfsiをメインの開発 "エンジン"として使い始め、その領域内のものを処理しています。私がデバッグする必要がある問題にヒットした場合は、問題のある関数をより小さなビットに分割し、その問題をデバッグしようとする作業をチェックする傾向があります。

しかし、コードの量をfsiで管理できるようにするためには、私がやったことに満足すれば、それを.fsに移動し、.fsをfsiに戻します。アプリケーションが大きくなるにつれて、これはリファクタリングが必要なときには、ちょっとした気分になり始めます.Fsファイルの内容を元に戻す必要があります。 .fsファイルに保存します。さらに、このスタイルは実際にテストの最初のアプローチではないので、一連のテストを構築する利点は得られません。 (私はブレークポイントを設定する能力を欠いているかもしれません/再帰などの特定の状況でistmが機能の一部を分割するよりもエラーを診断するために速くなるコードをステップすることができます - これはVS11で利用可能で、私はおそらく、最適なことをやっていないか、そうでなければ正しい方法で物事を考えないと思う。

他の人がアプリケーションを開発する方法を提供できるかどうか疑問に思っていました。あなたは主にfsiを使用していますか、またはtddで始まりますか? tddアプローチが主要な開発手段であり、FSIは、より複雑なアルゴリズム、データ探索などの実装を支援するために、より選択的に使用する必要があります。this questionを見てきました。明らかに、さまざまなtddフレームワークを指しています。 F#、しかし、私はまだ経験豊富なF#開発者のワークフローを見つけることに興味があります。

多くのTHX

S

+0

あなたは(http://blogs.msdn.com/b/carlnol/archive/2011/08/09/creating-f-fsx-script-files- [スクリプトファイル]を試してみましたfrom-fs-source-files.aspx?Redirected = true)?方法に沿っていくつかのテストを追加する良い機会のようです。 –

+0

Thx。あなたはそれを少し上に展開する可能性がありますtddにwrt?私はfsiで実行されるものを取得する "より自由な"方法として単にそれらを使用してきました。私は明らかに何かが欠けている! –

+0

REPLは適切なテストに代わるものではありません。彼らはむしろお互いを補完します。 https://twitter.com/missingfaktor/status/314452078682595328 –

答えて

12

私はあなたが正しい軌道に乗っていると思います。

開発プロセスは趣味の問題です。私はとにかく私のアプローチを共有します。

  • いくつかのファイルで開始します。fs各ファイルは、相互に密接に関連した機能のグループで構成されるモジュールを表します。それは最初から正確である必要はありません。あなたはしばしばモジュール間で物を動かす。
  • モジュールのスケルトンが準備ができたら、すぐにテスト用のファイルをいくつか作成します(fsx)。
  • テストプロジェクトを作成し、NuGetパッケージをセットアップします。私はしばしばNUnitとFsUnitを一緒に使用します。
  • fsxスクリプトで正しい結果が得られるたびに、それらをテストケースに移動します。 これを繰り返します。
  • メインプロジェクトにProgram.fsを組み込み、必要に応じてデバッグするために実行可能ファイルにコンパイルします。

一般に、F#REPLは主な開発エンジンです。それは私に即時フィードバックを与え、増分変更を可能にします。これはプロトタイピングに非常に役立ちます。 F#では、バグ率が他の言語よりもはるかに低いため、TDDの重要性は低くなります。そして、私はすべてをテストするのではなく、主な機能に焦点を当て、高いテストカバレッジを確保します。testdriven.netアドインまたはVisual Studio 2012 Premium and Ultimateを使用すると、テストカバレッジに関する有用な統計情報を得ることができます。

F#REPLとTDDを使用しているため、デバッグはほとんど必要ありません。間違った行動があるたびに、私はやめて考えます。コードには副作用がないため、簡単に原因を特定することができます。多くの場合推論といくつかの印刷コマンドが私に正しい答えを与えることができます。

F#REPLでTDDをUnquoteFsCheckで使用できます。前者は引用を介したテストを提供していますが、これはかなり印象的です。後者は、コードのコーナーケースを扱う際に魅力的なランダムなテスト手法を使用します。あなたのプログラムが特定の特性を満たさなければならないときは、本当に便利です。ただし、これらのフレームワークを適切に使用する方法を学ぶには時間がかかることがあります。

+0

Thx。非常に役立ちます。 –

+0

@GuyCoder:ありがとう、コードカバレッジについての文章を追加するだけです。 – pad

3

padは、非常に実用的でF#の新しい人にとって有益な素晴らしい答えを与えました。私は別の手段を与えて、他の人がF# 'ersがそれを行う方法が一つしかないとは思わないようにします。

注:プログラミングに新しく、パッドの答えにとどまるならば、新しいプログラマーにとってははるかに良いでしょう。 1のオブジェクトと考え、私は私が作成を開始するのに十分持っていたと感じたまではそのような言語では、私は、紙にオブジェクトやなどuse-casestate transitionsequence diagram、など様々なダイアグラムでの作業書き込みを開始するとObject Oriented世界で

私は通常、抽象的な概念から始めて、F#fsファイルのdiscriminated unions(DU)に変換して、使用をスキップします(例:C#ファイル内のオブジェクト)。つまりF# Interactiveと入力してから、いくつかの機能を追加します。私はいくつかの機能を持って、NUnitFsUnitを使ってNuGetを使ってテストプロジェクトをセットアップしました。 DUは抽象的なので、テストケースは一般的には書くのが難しいので、DU用のプリンタを作成してテストケースに挿入し、NUnitツールでプリンタからの出力結果をキャプチャします。必要に応じてテストケースを変更します。私が手で何も書かない理由の例は、theseを参照してください。

抽象的なDUが完了したら、コードに移動して抽象DUに変換し、抽象DUを人間/具体的な形式に変換することができます。場合によっては、parserspretty printersとなります。

主な点は、使用しているツールに焦点を合わせるのではなく、問題の抽象的な概念に焦点を当て、必要なときにツールを導入することです。

私はPROLOGにもプログラムしていますが、そこではREPLから始まり、ロジックが動作するとコードをストアに移動します。だから私はREPLを使用することに反対しているわけではありません。それは問題に近づく別の方法です。

EDIT例えばKenによって要求ごと

参照:Discriminated Unions (F#)と述べたようにサークル、EquilateralTriangle、広場、長方形1の継承されたタイプの形状の基本型を判別連合を作成しますセクション
Using Discriminated Unions Instead of Object Hierarchies

ので、代わりの探し:

type Shape = 
| Circle of float 
| EquilateralTriangle of double 
| Square of double 
| Rectangle of double * double 

あなたの質問がはるかに良い独立した質問のためになり、私が与えることができるよりもはるかに詳細な答えを得るので、私はあなたにそれを尋ねることをお勧めします。あなたは、この上の情報を検索する場合

もまた、判別組合のための次の置換(DU)で検索:

+0

Thx VM。そこに消化するビットがあります - 特に例!たとえば、C#で作業している場合にオブジェクト階層を作成するのとほぼ同じ時点でDUを作成すると思っているのでしょうか、それとも少し違うものを言っていますか?また、「DU用のプリンタを作成する」 - StructuredFormatDisplayAttribute? –

+1

「C#で作業している場合、オブジェクト階層の作成を開始するのとほぼ同じ時点でDUを作成すると思います。オブジェクト指向ではまずオブジェクトを考えますが、機能的にはまず機能を考えていますが、関数を書く前にいくつかの型が必要なので、基本以外のものについてはおそらくDUが必要になります。注:DUを必要としないプロジェクトは、基本タイプのすべての関数であるため、DUが常に必要であるとは思わないようにすることができます。問題。 –

+1

"また、" DUのためのプリンタの作成 "と言ったときの意味の例を挙げておきますが、実際にここで質問する必要があることは非常に良い質問です。ここでいくつか指摘しますが、参照:[fol.fs](https://github.com/jack-pappas/fsharp-logic-examples/blob/master/FSharpx.Books.AutomatedReasoning/fol.fs)あなたはまた必要ですAddPrinterについて知りたい場合:[fol.fsx](https://github.com/jack-pappas/fsharp-logic-examples/blob/master/Examples/fol.fsx) –

関連する問題