2014-10-08 119 views
2

我有一個消息傳遞一個包含一些狀態值的屬性包(.Net字典)。現在增加了範圍,所以也可以有一個兒童財產袋。我試圖得到一個乾淨的方法,它將使用孩子首先查找來自物業行李的狀態參數,否則會回落到父物業包。數據繼承與字典

我有一個工作解決方案,但它似乎應該是更好,更清楚。你能推薦一個改進嗎?

let private _fetchParameter (parameter : Parameters) (name : string) = 
    let success, value = parameter.TryGetValue(name) 
    match success with 
    | true -> Some(value) 
    | false -> None 

let internal _deepFetchParameter (child: Parameters) (parent: Parameters) (name : string) = 
    let foundValue = 
     match _fetchParameter child name with 
     | Some x -> Some x 
     | None -> _fetchParameter parent name 

    match foundValue with 
    | Some x -> x 
    | None -> invalidArg name (sprintf "Could not find parameter named %s in parameters or event." name) 

// an example usage 
let configSetting1 = _deepFetchParameter child parent "ConfigSetting1" 

一些小筆記:

  • 我意識到拋出異常是不地道的F#,但這是與一些標準.NET交互,並拋出一個異常,在這種情況下,正確的行動。 (應用程序的其餘部分會在這裏拋出異常,我想要保持一致)。
  • 我相信可能有更好的方式來表示F#中的數據繼承/數據範圍,但這是我在這個網站上提出的一個單獨的問題。我對這個問題的意圖是提高我對F#和功能設計的理解。
  • 參數是一類是類型化對改變或抽象掉的數據存儲<string, string>
  • 建議標準.NET dictionary<T,U>別名是好的,只要你能提出一個方法來合併的字典。
+0

它並不拋出異常是不是在F#「習慣」,它本質上創建了一個局部的功能,用相同的後果不管你正在使用的語言。在這種情況下,部分函數是不可取的,無論是F#,C#,VBNET,Java,C++還是PHP。 – 2014-10-08 21:48:40

+0

這將更好codereview.se – 2014-10-08 22:26:05

+0

直到現在還沒有聽說過。謝謝。 – MarcusMartin 2014-10-09 07:19:16

回答

2

我會在這坐裂:

let internal _deepFetchParameter (child: Parameters) (parent: Parameters) (name : string) = 
    let childFetch = _fetchParameter child 
    let parentFetch = _fetchParameter parent 

    match (childFetch name),(parentFetch name) with 
    | Some(x), _ -> x 
    | None, Some(x) -> x 
    | _ -> invalidArg name (sprintf "Could not find parameter named %s in parameters or event." name) 
+0

我喜歡這個,很清楚! – MarcusMartin 2014-10-08 21:58:01