[英]How can I add OCL restriction to the class variable?
我正在實施一個需要添加 OCL 限制的復合設計模式。 這是我正在使用的代碼片段。
public abstract class ComplexTerritory implements ITerritory {
private List<ITerritory> territories = new ArrayList<ITerritory>();
private Double surfaceArea;
private String name;
public ComplexTerritory(String name, Double surfaceArea) {
this.name = name;
this.surfaceArea = surfaceArea;
}
...
public Double getSurfaceArea() {
Double sArea = 0.0d;
for (ITerritory ter : territories) {
sArea += ter.getSurfaceArea();
}
return sArea;
}
}
public class City extends ComplexTerritory {
public City(String name, Double surfaceArea) {
super(name, surfaceArea);
}
}
OCL 限制與總表面積有關。 當您調用getSurfaceArea()
時,計算結果應與存儲為surfaceArea
的值匹配。 我如何使用 OCL 執行此操作? 這是我想出的,但我懷疑我是否可以使用 OCL 中方法的局部變量。
context ComplexTerritory::getSurfaceArea(): Real
post: self.surfaceArea = sArea
我的另一個想法是,也許我可以使用 OCL 遍歷列表,如下所示:
context ComplexTerritory::getSurfaceArea(): Real
def: let area : Real = 0.0
self.territories -> iterate(ter: ITerritory | area = area + ter.getSurfaceArea())
pre: self.surfaceArea = area
另外,OCL 應該用在我的抽象 class ComplexTerritory
還是City
class 上?
在沒有元模型的情況下,您的要求有點瘋狂。 假設您有一個具有 ComplexTerritory::surfaceArea 屬性的元模型,您可以使用 Complete OCL 片段補充您的 Java model:
context ComplexTerritory::getSurfaceArea(): Real
post: result = surfaceArea
但是正如已經觀察到的,不清楚為什么要使用 getSurfaceArea()。
您的 Java 看起來相當自由,所以我懷疑您的 OCL 只不過是文檔。 即使您使用 OCLinEcore 自動生成 Java 代碼,您仍然會發現后置條件只是文檔。 (Eclipse OCL 只檢查前置條件和后置條件的語法)。
如果你編碼
context ComplexTerritory::surfaceArea : Real
def: territories.surfaceArea->sum()
作為 OCLinEcore 的屬性,將合成 Java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.