Форум Сообщества Аналитиков

×


Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Vadim

Страницы: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 »
76
В стандарте в самом конце 11.5.3.2 есть фраза "An AssociationClass cannot be a generalization of an Association or a Class.". Я согласен, что элемент модели, который наследует от AssociationClass, тоже должен быть AssociationClass. Но это не значит, что на диаграмме этот элемент модели должен изображаться как AssociationClass, если для цели диаграммы достаточно только изображения класса (ассоциации), то хороший инструмент (который четко различает модель и диаграмму) должен:
  • не разрешать подчинять классу-ассоциации просто класс или просто ассоциацию
  • давать возможность на диаграмме представлять класс-ассоциацию как класс или как ассоциацию
MagicDraw не выполняет 2, EA не выполняет 1.
Кто-нибудь знает такие инструменты, которые выполняют оба?

77
Исправленная диаграмма - свойства должна иметь разные имена!

78
Только бы редефайнов навставлять
Обычно не использую редефайны - они утяжеляют диаграмму. Считаю, что если подкласс имеет свойство с тем же именем, что и суперкласс, то редефайн подразумевается.
Тут есть ещё один момент - поясню на примере: полюс класса-ассоциации от Студента к Предмету отображает и то, что Студент имеет свойство "предмет" с множественностью "*", и то, что Изучение имеет свойство "предмет" с множественностью "1" (по крайней мере OCL так считает). 
и наследование как-нибудь позамысловатее -- начинать от линий ассоциации.)
 
Во вложении. MagicDraw позволяет рисовать наследование от любой из 3 частей (класс, ассоциация, пунктирный соединитель) к любой (можно подчинить класс ассоциации и наоборот, класс подчинить соединителю, соединитель - ассоциации и т.д.)!
На серой рука тянется объявить, что наследование подчиняется "принципу Рамбо" и считать, что наследники наследуют от класса ассоциации только классовую часть.
Наоборот, наследники наследуют всё, просто только в классовой части есть отличия, поэтому на диаграмме наследник нарисован не в виде класса-ассоциации, а в виде класса.
А решение с одним классом ассоциацией, у которого опциональные поля и составные части, рассматривалось?
Для точного специфицирования возможных ситуаций (а их в примере 3: без экзамена, экзамен не сдавался, экзамен сдан), мало указать опциональность полей, надо добавлять ещё ограничения. А что такое "составные части" - группы полей или что-нибудь другое?

79
Но на вскидку мне кажется странным, что между Студентом и Предметом возможны сразу 5 видов отношений одновременно, даже и взаимоисключающих.
Отношение одно, остальные 4 - его вариации.
А картинка в ЕА какая?
Во вложении

80
Вот предметная область:
Студенты изучают Предметы (ассоциация многие-ко-многим). Надо бы зафиксировать сколько времени Студент потратил на Предмет (ассоциация переходит в класс-ассоциацию - нужен атрибут). Некоторые Студенты по некоторым Предметам уже сдали экзамен: есть дата и оценка (а вот тут и нужен подкласс "Сдан экзамен")
С точки зрения экзамена изучение разбивается на 2 подкласса: "с экзаменом" и "без экзамена". "С экзаменом" тоже разбивается на 2 подкласса: "Экзамен сдавался" (с атрибутами "дата" и "оценка") и "Экзамен не сдавался". С точки зрения зачета - аналогично (и независимо?!).
Во вложении - что от меня требует MagicDraw 16.5. (и это только по экзаменам, без зачетов - зачеты потребуют ещё 4 классов-ассоциаций). Картинка не смотрится. Другие инструменты (ЕА) дают изобразить подчинение через подчинение классов классу-ассоциации и картинка смотрится.

81
Ничего не понял, если честно :)
С точки зрения экзамена изучение разбивается на 2 подкласса: "с экзаменом" и "без экзамена". "С экзаменом" тоже разбивается на 2 подкласса: "Экзамен сдавался" (с атрибутами "дата" и "оценка") и "Экзамен не сдавался". С точки зрения зачета - аналогично (и независимо?!).

82
Почитало про выводимость у Фахрутдинова. Мне понравилось. По его формулировке можно сделать вывод, что если для атрибута есть сеттер, то он выводимый. Ну, или мой переводчик с английского на нлошный глючит.)
Дайте, пожалуйста, ссылку.
Авторы стандарта uml позаботились о том, чтобы поставить рогатку на этом пути. В 9.5.3 сказано, что uml'ьный init работает только в отсутствие "specific setting for the Property"(???) и в отсутствие ocl'ьного init. Авторы стандарта ocl написали так, как-будто про uml'ьный init слыхом не слыхивали, т. е. подпели.
Такая трактовка (лог. выражение, которое должно быть истинным) нестандартна (расходится со стандартом ocl).
Я понимаю, что это противоречит текущему (им) стандарту! Пытаюсь найти пути реализации потребности минимально модифицируя стандарт (или его трактовку). Осознаю, что любой, даже самый минимальный, отход от стандарта - опасен (читатель диаграммы поймет строго по стандарту - и будет прав).

83
Только если студенты сдают по предмету один единственный экзамен (или другое аттестационное мероприятие). Не очень жизненная ситуация, многие предметы имеют одновременно зачет и экзамен, а также несколько зачетов и экзаменов, правда не в одном семестре.
Так ситуации ещё разнообразнее: есть/нет экзамен, есть/нет зачет, если есть экзамен (зачет), то он уже был/не был. Если каждый подкласс сопровождать изображением ассоциации - очень запутанная диаграмма.

84
Если мы верим в принцип Лизковой, то подкласс класса ассоциации -- не просто класс, но и [класс] ассоциация.
Верим, поэтому конечно "подкласс класса ассоциации -- не просто класс, но и [класс] ассоциация", но это необязательно обозначать на диаграмме, если у этой ассоциации нет ничего нового, по сравнению с исходной.
Кстати "Лизковой" - это здорово, сразу видно, что речь идет о женщине, а то некоторые об этом забывают (а то и не знали никогда).
В каноническом RUPовом примере наследник явно обозначен как класс ассоциация (хотя, там это оправдано по смыслу).
А вот здесь есть новое, поэтому изображение ассоциации на диаграмме оправдано (но это выбор не инструмента, а пользователя, который, правда ошибся - 0..4 не может наследовать 0..2)
Может быть, создатели MagicDraw хотят, чтобы и Вы явно указывали наследника как класс ассоциацию.
Так они могут захотеть чтобы я и остальные наследуемые свойства указывал - какая тогда выгода от такого изображения наследования
В обратную сторону происходит усложнение предка в наследнике. От обычного класса берутся атрибуты, операции, связи. К ним добавляется всё то, что доопределено в наследнике.
В наследнике доопределяется только то, что связано с его "классовой" сутью, поэтому на диаграмме отображается только класс (отображая и ассоциацию, что можно при ней указать - или ничего, или повторить то, что на родительской)

85
Вопрос, конечно, не по адресу. Это нужно вендору задавать.
Ну зачем уж сразу вендору, здесь могут быть те, кто реально поможет.
Но, думаю стоит посмотреть на стандарт UML, является ли такое отношение допустимым как синтаксически, так и семантически.
В стандарте класс-ассоциация не имеет каких-нибудь ограничений, которые мешают быть участником обобщения с любой из сторон.
Класс ассоциация - это очень близкий аналог таблицы связи в базах данных, которая используется для устранение неспецифичной для реляционной модели связи многие-ко-многим.
Скорее ассоциация многие-ко-многим - это очень близкий аналог таблицы связи в базах данных. А класс-ассоциация почти всегда ассоциация многие-ко-многим.
Что-то не могу себе представить потребность создание категориального кластера, в которой порождающей сущностью будет по сути производная от отношения двух других сушностей.

Можно рассмотреть пример подобной конструкции?
Студенты изучают Предметы (ассоциация многие-ко-многим). Надо бы зафиксировать сколько времени Студент потратил на Предмет (ассоциация переходит в класс-ассоциацию - нужен атрибут). Некоторые Студенты по некоторым Предметам уже сдали экзамен: есть дата и оценка (а вот тут и нужен подкласс "Сдан экзамен")

86
Версия MagicDraw 16.5. Не могу создать связь подкласс-суперкласс, если суперкласс - класс-ассоциация, а подкласс - просто класс (не ассоциация).
Если пытаюсь перенести уже созданную (между классом и классом) связь - выдает сообщение-предупреждение: "Между этими элементами отношения заблокированы или не разрешаются".
Может есть какой-то вариант?
Кстати в обратную сторону сделать класс-ассоциацию подклассом просто класса - работает!

87
Согласно текущей версии модели других способов создания заявок пока нет. Т. е. операция нужна, чтобы описать, как [вообще] создаются Заявки. К слову, в этом месте стандарт не декларирует, а рекомендует, т. е. указывает некоторую сложившуюся практику.
С конкретной операцией (как элементом модели) будет связан конкретный экземпляр стереотипа <<create>>. С ним, в свою очередь, -- ограничение. Задать ограничение внутри класса для всех его конструкторов проблематично. Если мы не имеем в виду init:, конечно. Можно дать define-ом общее ограничение, но в каждом постусловии конструктора придётся явно сослаться на него.
Вот-вот, если про создание сказать нечего, кроме того, что есть правило расчета значения атрибута создаваемого объекта - можно и не создавать операцию со стереотипом <<create>>.
Ну, это был повод дать повод поговорить о некоторой избыточности OCL-я, который не только дополняет UML, но и в чём-то дублирует.
Прибавлю,  что если модель где-то стабильна, то снизить её модифицируемость в этом месте можно.
Мне избыточность (в виде возможности выразить одно и то же несколькими способами) тоже не очень нравится, хочется её приспособить для чего-нибудь нужного, например:
Значение по умолчанию (задается в виде "=defaultValue" или "init: defaultValue") означает каким будет значение property в момент КОНЦА, а не НАЧАЛА инициализации экземпляра объекта. Если есть 2 способа для обозначения одного и того же, может один из них использовать для чего-то другого (например для значения property в момент НАЧАЛА)?
Или для решения свежей проблемы:
Теперь о новой проблеме. Пусть есть Склад, который связан не с одним, а со МНОГИМИ Кладовщиками. Накладная связана с одним Складом и с одним Кладовщиком (причем ни Склад, ни Кладовщик со временем не меняются {readOnly}). В момент создания Накладной её Кладовщик должен быть одним из Кладовщиков, связанных с её Складом, но это только в момент создания. Получается нужен init не типа derive (правило для вычисления значения), а типа invariant (правила проверки того, что значение является подходящим). Как init он действует только при создании, а как invariant не вычисляет, а проверяет.
можно было бы считать, что init не задает выражение, которое рассчитывает значение, а является логическим выражением, которое должно быть истинным в момент создания: для описанного примера context накладная init: self.склад.кладовщик->includes(self.кладовщик).
Я всё ещё верю, что readOnly выводимые значения вычисляются [только] в момент создания объекта. Т. е. derive не "распространяет" readOnly дальше -- на элементы вычисляемого выражения.
Если так, то того же эффекта можно добиться сочетанием init или = (с выражением как в derive) и readOnly - и вычислим в момент создания объекта, и на элементы вычисляемого выражения никакого влияния.

88
Вдруг уже не актуально, тогда простите.
Актуально, появились новые проблемы, но о них в конце.
На диаграмме классов описываем

Заявка
--------------------------------
датаСоздания : Дата = сегодня() {readOnly}
датаВстречи : Дата {readOnly}
--------------------------------
<<create>> новаяЗаявка(дВ : Дата) : Заявка

к этой операции приякориваем примечание о том, что пользователю в формочке для создания заявок предложат по умолчанию, и о том, что из формочки будет вызван этот конструктор.
Получается операция нужна только для того, чтобы к ней "приякорить" примечание - если в примечании указать, что оно относится к созданию Заявки (любому, не обязательно связанному с конкретной операцией), то этого достаточно. Примечание в этом случае будет связано не с конкретной операцией, а с <<create>> для Заявки.
на ocl пишем:
context Заявка::датаСоздания : Дата
init: сегодня()
Это мы продублировали кусок uml-ного описания атрибута, чтоб определение работало в два раза сильнее.))
Дублирование - это плохо, а почему - Вы и сами знаете:
Понятно, что дублирование ограничений делает модель менее модифицируемой. Вместо того, чтобы править в одном месте, правим в 2-3 местах.

context Заявка::новаяЗаявка(дВ : Дата) : Заявка
post: result.датаВстречи = дВ
это мы рассказали о том, что датаВстречи заполняется конструктором, параметром которого является значение даты.
Да, при наличии операции надо объяснить её работу. И ещё где-то надо рассказать, про начальное значение, равное сегодня().
Если есть желание утроить, то можно ещё
context Заявка::новаяЗаявка(дВ : Дата) : Заявка
post: result.Создания = сегодня()
Строго говоря, это не "чистое" утроение - мы говорим, что операция новаяЗаявка подчиняется общим правилам в отношении датыСоздания, то есть утроение только для операции новаяЗаявка. Если будет еще одна операция с <<create>>, то для неё утроение будет, если и в ней написать "post: result.Создания = сегодня()".

Теперь о новой проблеме. Пусть есть Склад, который связан не с одним, а со МНОГИМИ Кладовщиками. Накладная связана с одним Складом и с одним Кладовщиком (причем ни Склад, ни Кладовщик со временем не меняются {readOnly}). В момент создания Накладной её Кладовщик должен быть одним из Кладовщиков, связанных с её Складом, но это только в момент создания. Получается нужен init не типа derive (правило для вычисления значения), а типа invariant (правила проверки того, что значение является подходящим). Как init он действует только при создании, а как invariant не вычисляет, а проверяет.

89
Когда начинал тему, проблема была довольно абстрактной, на уровне "хорошо бы". А сегодня на работе реальный вопрос: создаем заявку, а в ней 2 атрибута: дата создания и дата встречи. "Дата создания" должна получить в качестве значения текущую дату и больше не меняться. "Дата встречи" должна получить в качестве значения то что укажет пользователь при создании заявки и больше не меняться. А пользователь в качестве предлагаемого значения "даты встречи" получает текущую дату. Что для этой ситуации максимально можно сделать в рамках UML+OCL?

90
Вам надо время от времени итожить свою дискуссию, чтобы сохранить ее понимание для окружающих :)
Попробую. ИМХО:
  • Значение по умолчанию (задается в виде "=defaultValue" или "init: defaultValue") означает каким будет значение property в момент КОНЦА, а не НАЧАЛА инициализации экземпляра объекта. Если есть 2 способа для обозначения одного и того же, может один из них использовать для чего-то другого (например для значения property в момент НАЧАЛА)?
  • Во многих источниках (включая сам стандарт UML!) если property является derived, то и readOnly. Это, как правило, ошибка (сама ситуация допустима, означает, что исходные данные могут меняться только так, что значение derived property остаётся неизменным). Причина:
    Цитата: [прилетело НЛО и...
    link=topic=6740.msg41789#msg41789 date=1495545952] путают "не может меняться извне" с "не может меняться после инициализации".
  • Если property и derived, и имеет defaultValue возникает неоднозначность. Стандарт (OCL 7.3.7) это видит:
    Цитировать
    "Initial and derivation expressions may be mixed together after one context. ... The derivation constraint must be satisfied at any time, hence the derivation includes the initialization. Both are allowed on the same property but they must not be contradictory."
    , но вместо исключения ситуации предлагает "примирение" с ней.

Страницы: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 »