簡體   English   中英

如何向 class 變量添加 OCL 限制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM