详情
我有Eclipse Papyrus设计的Login部分的活动图。现在我必须为以下条件编写OCL约束:
答案 0 :(得分:0)
这似乎与Activity Diagrams有很大关系。你的新措辞是明确的,一个表单上的5次尝试或五种表单中的每一次尝试都是不好的,因此User_Account :: failedAttempts(而不是login :: attempts)是一个明智的模型功能。
约束最常被定义为User_Account :: failedAttempts上的5的上限。请注意,约束定义了什么是有效的,而不是如何对无效做出反应。您可以在maximumAttempts()计算值上更多地使用上限的不变量。您可以在操作中无意地使用前/后条件或仅编织控制操作。
你可以理智地拥有一个User_Account :: isLocked()操作,它的主体是failedAttempts> = maximumAttempts()。
活动为模型提供控制。据推测,它有一个与创建/破坏登录相关的生命线。据推测,它使用DataBase :: checkPassword(userName,password)操作返回User_Account并将User_Account :: failedAttempts增加为副作用。因此,最大值的强制执行是User_Account :: checkPassword。 (注意,您不应该对User_Account查找进行两阶段访问,然后进行密码验证,以确保黑客无法区分,可能只是响应时间,是否由于用户名错误或密码错误而导致失败。)
您需要清楚地识别模型中的内容;在系统持续时间内持续存在的情况,可能是在系统重启后从备份恢复的。因此,User_Account必须具有用户名和密码以及failedAttempts属性来定义持久状态。
相反,当启动另一个用户交互时,View / Control的一部分可能会丢失并重新创建。因此,登录表单还具有用户名和密码属性,用于表示在表单上输入的内容以及可能与DataBase :: getUserAccount和UserAccount :: checkPassword相关联的Model DataBase。
我不会使用临时登录内容污染持久性DataBase模型。如果您需要在服务器故障中重新创建正在进行的登录尝试,我将拥有一个单独的ViewDataBase的瞬态查看状态。如果没有别的,你可以通过在重新激活瞬态活动之前重新激活持久数据库来恢复服务器故障。