Ограничение OCL, чтобы строки не были пустыми

У меня есть диаграмма классов с многочисленными классами, некоторые из которых содержат атрибуты типа string. Я хочу, чтобы все мои строки имели длину не менее 1.

Простое (но уродливое) решение выглядит следующим образом:

context Class1
inv:    self.attributeOfTypeString.size > 0

context Class2
inv:    self.attributeOfTypeString.size > 0

...

Знаете ли вы способ определить ограничения OCL для всех атрибутов, соответствующих шаблону? Что-то типа:

global.select(attr | attr.TYPE = string) -> forall (str : string | str.size > 0)

person Bastien Pasdeloup    schedule 24.11.2013    source источник


Ответы (1)


Наконец-то получил ответ откуда-то еще. Делюсь, вдруг кому понадобится. Возможны три пути решения проблемы.

1°) Во-первых, следует помнить, что в UML разрешено множественное наследование. Следовательно, мы можем сделать все классы со строковым атрибутом наследованием от класса WithString и установить ограничение OCL для этого родительского класса. Однако это делает диаграммы нечитаемыми.

2°) Другая возможность — создать класс String и хранить экземпляр этого класса вместо всех строковых атрибутов. Проблема с этим решением для инкапсуляции заключается в производительности (использование геттера для всех строк).

3°) Наконец, самым чистым решением, на мой взгляд, является следующее: мы можем объявить ограничение OCL на метауровне. В диаграмме классов, описывающей диаграммы классов, мы можем просто указать, что все строки непусты.

person Bastien Pasdeloup    schedule 02.12.2013