我有很多乐趣学习Alloy,我很高兴将它应用到我正在进行的一些软件项目中。
过去,我已经非正式地使用了轻量级的形式化方法,如果是的话,用一阶逻辑来编写一些我希望系统具有的不变量。我从来没有用它来发现缺陷,只是把我的设计和测试集中在关键属性上。
我现在想超越它,实际上使用Alloy来查找架构中的错误。我怎样才能做到这一点?我采取的方法是:
assert
check
和run
然而,在学习很多关于Alloy的同时,这并没有帮助我改进我的架构。在简化我的模型的过程中,似乎我编码的不变量相应地被简化,并且自然成立。
例如,我们仅通过原型设计和测试遇到了架构中的错误。该错误与假设我们是否在序列中有n
个项目有关,我们可以将它们分成m
组并按顺序处理每个m-group。 (n
恰好比m
大得多。)问题当然是m
并不一定要划分n
,因此最后一组可能是太小。这是一个完全可以在逻辑上表达的设计级缺陷,恰恰是为了而设计的缺陷类型。然而,我的Alloy模型并没有找到它。它简单地抽象出整数大小(参见Why does Alloy tell me that 3 >= 10?中给出的建议以避免使用数字),将n划分为不相交的组,并且运行得很漂亮。
换句话说,似乎确保您的模型包含足够的细节来捕获缺陷,您几乎需要提前了解缺陷。
您如何使用Alloy审核软件架构?
PS我明白有很多情况下你没有遇到这个问题。例如,在查看分布式系统的规范时,想要显示不变量。我的挑战是应用Alloy来帮助实现,而不是审查协议或规范或状态机或其他逻辑构造。
答案 0 :(得分:1)
合金不适合推理数字或字符串。 因此,您的模型通常无法检测与给定字符串的格式或给定整数字段的值相关的错误。
现在,合金的优点在于推理关系和对这些关系的限制。 检查断言是确保给定属性成立的一种方式,所以你是对的,只使用这种技术,你可能会觉得你需要提前知道这个缺陷。
因此,我更倾向于使用run命令来简单地为您提供一组满足模型约束的实例。 在这里,您将自己检查在您建模的上下文中生成的一系列实例是否“有意义”。你可能会看到你的一些约束条件过于严格或没有足够的限制,因此可以增强你的模型。