欢迎!请参阅 关于 页面以获取有关如何操作的更多信息。
fn 特殊形式和 defn 宏允许设置前置和后置条件。如果在 defprotocol 和 deftype 宏的方法声明中也能使用这些条件将很好。
目前我使用 extend 函数作为绕过方法,可以在关键字-名称和 fn 特殊形式映射中指定方法。
评论由:michael-drogalis 提出
使用 {{:pre}} 和 {{:post}},我认为这不是一个好的主意。处理断言是一个两部分的博弈。机制需要考虑检测和反应,而后者是缺失的。
这不是一个完美的解决方案,因为它有点冗长,但是使用(链接:https://github.com/MichaelDrogalis/dire 文字:Dire)可能比使用 extend 更好。此外,你得到的是 {{:pre}} 和 {{:post}} 中缺失的“反应”功能。
关于协议前置条件的示例:https://gist.github.com/4471276
评论由:akiel 提出
@Michael 我阅读了你的(链接:https://gist.github.com/4471276 文字:gist)和(链接:https://github.com/MichaelDrogalis/dire 文字:Dire)的 README。我认为 Erlang 的监督概念有其位置,但我不太喜欢它用于前置和后置条件。对我来说,这样的条件有两个目的
为了支持我的第一个观点,您的先决条件和后置条件与实际函数定义在词汇上太远了。关于第二个观点:我认为在违反规定的情况下,程序应该直接崩溃。也许可以用您的异常监督器之一封装程序的一部分来处理AssertionError。但我认为对于单个函数的先决条件和后置条件违例的处理并不是一个好主意。
@ Alexander 的观点确实正确。Dire 应该就是您描述的那样。从应用逻辑中分离出来,以及在崩溃中恢复的机会。无论如何,这是我快速帮助您的最好办法。 :)
我想这可能是因为相关的接口可以在 Java 中实现。在这些实现中不会包括先决条件和后置条件,这可能会破坏假设。