私はF#の新機能ですので、何年ものC#/ Java OOPの後で私の考え方を変えるのは難しいです。F# - 健全性チェックとオプション
私はイベントハンドラMyForm.SelectFile(filePath:String)
を使用してダイアログを開き、読み込むファイルを選択できるようにしました。ファイルを選択すると、Parser.LoadFile(filePath:String)
が呼び出されます:「アルファ」と「ベータ」:
static member LoadFile(filePath:String) =
if not <| ZipFile.IsZipFile(filePath) then
failwith "invalid file specified."
use zipFile = new ZipFile(filePath)
if zipFile.Count <> 2 || zipFile |> Seq.exists(fun x -> x.FileName <> "alpha" && x.FileName <> "beta") then
failwith "invalid file specified."
zipFile |> fun x -> Parser.Parse(x.OpenReader())
私は常に拡張子なしの2つのファイルを含む有効なzipアーカイブであることを選択したファイルを期待しています。
まず、自分の入力を消毒するには良い方法がありますか?
私のif文はかなり長く、私はF#がよりよい解決策を提供できると確信していますが、本当にわかりません。
第2に、failwith
を使用すると、私のMyForm.SelectFile(filePath:String)
メソッドで例外を処理することが強制され、オプションがより良い解決策になると思います。
私がZipFile
をインスタンス化する必要があるため、2つの異なる連続したチェック(ZipFile.IsZipFile
と内容)を実行する必要がある場合、それらを使用する方法を理解できません。
C#では、チェックが失敗した場合にnull
を返すだけで、戻り値をnull
と照合すると、エラーを表示するか続行する必要があるかどうかがわかります。
現在のコード:それはのように書かれていた場合
type Parser with
static member isValidZipFile (zipFile:ZipFile) =
(zipFile.Count = 2) && (zipFile |> Seq.forall(fun x -> (x.FileName = "alpha") || (x.FileName = "beta")))
static member LoadFile(filePath:String) =
if not <| ZipFile.IsZipFile(filePath) then
None
else
use zipFile = new ZipFile(filePath)
if not <| Parser.isValidZipFile(zipFile) then
None
else
Some(seq { for zipEntry in zipFile do yield Parser.Parse(zipEntry.OpenReader()) } |> Seq.toArray)
Code Reviewでコードのより完全な部分(コンパイル済み)を送信することを検討してください。コードを機能的に構造化する方法の詳細な解答が得られます。 – asibahi