欢迎!有关此如何工作的更多信息,请查看关于页面。
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而导致的。任何这样的实现都不会包括预条件和后条件,这可能会打破假设。