我遇到了一些看起来像这样的代码。
"R** F******" < r.f******@l*****s.co.uk >
这是一个潜在的错误配置工具,在对其执行操作之前不断检查member this.Send (data:array<byte>) =
if tcpClient.Connected then
// Send something.
member this.Open () =
if not tcpClient.Connected then
// Connect.
是否已连接。
类似的问题是在对某事进行操作之前检查某事物是否为TcpClient
。
处理此问题的一般方法是什么? 我正在思考一个monad的线条,它抽象了这个无聊的检查。
修改
我可以编写许多方法,每个方法都要检查我们是否已连接。
null
答案 0 :(得分:1)
因此,这取决于您是要在包装类中还是在包装类之外进行检查。在课堂上进行检查,我不知道计算表达式是如何真正相关的;你没有绑定操作。
只有在包装类之外(即从调用函数)进行检查时,工作流表达式才有用。如果同时创建connected
构建器,则生成的代码看起来像
connected {
do! wrapper.Send(..)
do! wrapper.Throttle(..)
do! wrapper.SendAsTest(..)
}
然而,这并不比
简单if wrapper.connected do
wrapper.Send(..)
wrapper.Throttle(..)
wrapper.SendAsTest(..)
那么,有点什么,重点是什么,对吧?
如果您有多个tcpClient
包装器对象并且需要将它们全部连接到您的工作流程中,那么它会更有意义。这更像是&#34; monadic&#34;方法是为了。
connected {
do! wrapper1.Send(..)
do! wrapper2.Throttle(..)
do! wrapper3.SendAsText(..)
}
但是,具体到你在包装类中进行检查的例子,就像我之前所说的那样,monads不适用。解决该特定问题的一个巧妙方法是尝试模仿一些先决条件,如以下链接http://laurent.le-brun.eu/site/index.php/2008/03/26/32-design-by-contract-with-fsharp。我不知道它是否比if
陈述更直观,但如果你正在寻找一种有趣的做事方式,那就是我能想出最好的。
最终,您现有的代码将变得紧凑。大概不是所有你的函数都会以相同的if
语句开头,所以那里没有任何不必要的重复。