[英]How do I find a UML object if I only know the value of one of its attributes in OCL?
我有一個具有屬性id
的 UML class Student
。 我想在 OCL 中編寫一個查詢,僅通過知道它的id
來查找特定的Student
。 我應該使用allInstances()
嗎? 還是派生? 我對OCL不是很熟悉。
通常 OCL 用於表達對 UML model 的一些約束,與給定的 class 實例( context
或self
)相關,您將從特定實例開始導航。
但是 OCL 是作為一種正式的規范語言開發的,它不僅可以用來指定約束,特別是 7.1 節中解釋的查詢。 的 OCL 規范。
如果您想表達有關 class MyClass
的所有可能實例的內容,則可以從以下內容開始您的子句:
MyClass.allInstances()
Wich 是包含給定 class 的所有實例的集合。 通常,您將在此集合上進行操作以進一步指定一些 model 功能。
例如,為了表達一個 id 的唯一性,你可以在這個集合上寫一個 Boolean 子句(基於 OCL 規范的第 7.5.10 節的例子)
MyClass.allInstances()->forAll(e1, e2 | e1 <> e2 implies e1.id <> e2.id)
您可以對此類集合執行的操作之一是通過選擇與特定條件匹配的元素來創建子集,這應該可以回答您的問題:
MyClass.allInstances()->select(c|c.id='...')
額外的想法:
OCL 是一種抽象語言。 沒有說明如何實現這個表達式。 這可能是對內存中集合的一次低效迭代,或者是非常有效的 SQL 查詢。 OCL 將幫助您定義結果應該是什么,而不是如何真正得到它。 因此,在這個抽象級別上,性能不應該是您關心的問題。
現在,您沒有說明 OCL 查詢的目的。 如果要解釋如何執行數據庫查詢,您可以看到關注點分離的一些優勢:識別相關類和可重用查詢並使用存儲庫模式豐富您的 model:存儲庫是(單一)class MyClassRepository
充當數據庫中給定MyClass
的所有對象的容器。 然后,您將定義操作和查詢數據庫的操作。 通常,您將有幾個getXxxx()
操作,例如 getById( getById()
,它們返回一個或一組多個實例。 首先,它將明確將要實現的數據庫功能,其次,新操作可用於簡化一些 OCL 表達式。
是的。 allInstances() 是最簡單的解決方案,但可能效率最低且不一定靈活。
如果您的應用程序和約束(針對一所學校)擴展到多所學校,您可能會意識到實際上您想要特定學校的學生,因此通常最好將 go 到邏輯上下文並調用學校上的方法以返回給學生。 也許這就是您所說的“派生”。 School.students->at(id) 的實現很可能使用 Map 提供多重收益,通過不為每次訪問搜索整個 model 並通過快速訪問您已經獲得的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.