如何在每个方法调用中处理检查有效状态

时间:2015-05-07 14:45:02

标签: f#

我遇到了一些看起来像这样的代码。

"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

1 个答案:

答案 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语句开头,所以那里没有任何不必要的重复。