저는 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())
난 항상 확장자없이이 개 파일이 포함 된 유효한 우편 아카이브로 선택한 파일을 기대하고있다.
먼저 입력을 살균하는 더 좋은 방법이 있습니까?
내 if 문이 꽤 길고 F #이 더 나은 솔루션을 제공 할 수 있다고 확신하지만 실제로 이해할 수는 없습니다.
둘째, failwith
을 사용하면 내 MyForm.SelectFile(filePath:String)
메서드에서 예외를 처리해야하며 옵션을 사용하면 더 좋은 해결책이 될 수 있다고 생각합니다.
ZipFile
을 인스턴스화해야하기 때문에 두 가지 연속 확인 (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)
코드 검토에서 (컴파일 된) 코드의 더 완전한 부분을 제출하는 것을 고려하십시오. 코드를 기능적으로 구조화하는 방법에 대한 자세한 답변을 얻을 수 있습니다. – asibahi