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>
別名是好的,只要你能提出一個方法來合併的字典。
它並不拋出異常是不是在F#「習慣」,它本質上創建了一個局部的功能,用相同的後果不管你正在使用的語言。在這種情況下,部分函數是不可取的,無論是F#,C#,VBNET,Java,C++還是PHP。 – 2014-10-08 21:48:40
這將更好codereview.se – 2014-10-08 22:26:05
直到現在還沒有聽說過。謝謝。 – MarcusMartin 2014-10-09 07:19:16