Абстрактное/конкретное разделение классов на диаграмме последовательности

Есть ли способ разделить абстрактный класс и его конкретные ветви на диаграмме последовательности?

Мой вариант использования заключается в том, что некоторые транзакции должны обращаться к методам, реализованным в абстрактном классе, а некоторые из его конкретных реализаций.

Или это касается диаграммы классов, а не диаграммы последовательности?


person user487772    schedule 27.12.2014    source источник
comment
Способ сделать это — добавить для него отдельную линию жизни и показать ей сообщения. Что касается стандартной нотации, которую вы видите на диаграммах отношений классов и современных сущностей, я не уверен. SD должны быть простыми, основываясь на диаграммах, которые я видел, я думаю, что это было бы более подходящим для диаграммы классов.   -  person ChiefTwoPencils    schedule 27.12.2014
comment
Я бы не хотел добавлять новую линию жизни, пока не смогу показать взаимосвязь между абстрактными и конкретными классами. Однако я согласен, что это, скорее, проблема диаграммы классов.   -  person user487772    schedule 27.12.2014
comment
Если вы хотите смоделировать два разных класса, то на диаграмме последовательности это будет означать две разные линии жизни. Вот и все. Вы можете отобразить любой <<stereotype>> (включая <<abstract>>) в заголовке линии жизни, как показано в этом примере: uml-diagrams.org/sequence-diagrams-examples.html#pluck-comments   -  person xmojmr    schedule 27.12.2014
comment
Почему бы не опубликовать это как ответ? ;-)   -  person user487772    schedule 27.12.2014
comment
Что касается стереотипов в этом примере, я не уверен, что это стандартный UML. Модели хороши тем, что они могут отражать выбранный вами уровень детализации, но проблема, которую я вижу, заключается в инструментах. FE, Visual Studio UML SD не позволяют добавлять стереотипы к линиям жизни. Тогда это будет что-то, что нужно будет добавить вне VS и, следовательно, не будет добавлять детали в модель, как ее видит VS, и каждый раз, когда ваша модель изменяется, вам придется добавлять ее обратно после рендеринга ее в изображение или подобное. Это может не беспокоить вас; просто что-то рассмотреть.   -  person ChiefTwoPencils    schedule 27.12.2014
comment
Тоже верный ответ.   -  person user487772    schedule 28.12.2014
comment
@ChiefTwoPencils: спецификация UML позволяет расширять себя за счет использования индикатора <<stereotype>>. Когда инструмент не позволяет вам добавлять стереотипы к артефакту, который он предоставляет, в той мере, в какой этот инструмент не поддерживает спецификацию UML. Так что да, xmojmr абсолютно прав в том, что касается UML, говоря, что вы можете добавить стереотипы в заголовок диаграммы последовательности. Диаграмма, на которую он ссылается, является хорошим примером использования стереотипов.   -  person BobRodes    schedule 01.01.2015
comment
@BobRodes, все, что я могу сказать, это то, что ты, вероятно, ошибаешься; по крайней мере, в контексте различия между абстрактным и конкретным, особенно когда дело доходит до абстрактного. Это даже не стереотип; если это представлено как таковое, это не в соответствии с тем, что не только соответствует стандарту VS, который довольно точно соответствует UML, но также и уважаемой книге, на которую я не буду ссылаться из-за лени. abstract не представлен как стереотип (‹‹...››), он представлен стандартным способом как SomeAbstractClass не ‹‹abstract››.   -  person ChiefTwoPencils    schedule 01.01.2015
comment
@BobRodes, однако ‹‹интерфейс›› есть. Мое, все еще актуальное, замечание заключалось в том, что есть инструменты, в которых вы наверняка можете делать то, что вам нравится, и, если нужно, — пусть будет так. Но некоторые вещи, как бы вы ни хотели представить их определенным образом, не вычисляются.   -  person ChiefTwoPencils    schedule 01.01.2015
comment
@BobRodes и др.: Пожалуйста, прочтите!   -  person ChiefTwoPencils    schedule 01.01.2015
comment
@ChiefTwoPencils: я думаю, что мы говорим мимо друг друга. Существует множество способов представления абстрактного класса, включая выделение имени класса курсивом, как вы упомянули. Однако также верно и то, что стереотипизация — это механизм расширения, который можно применять с тем ограничением, что вы не можете использовать существующее ключевое слово как одно. Итак, если вы хотите создать стереотип под названием ‹‹abstract›› (который не является ключевым словом) и добавить его в профиль, пояснив, что он относится к абстрактному классу, который не является интерфейсом, который полностью соответствует UML спецификация механизмов расширения.   -  person BobRodes    schedule 03.01.2015
comment
Я не спорю, что это обязательно лучший способ сделать это. Я только говорю, что это правильно с точки зрения спецификации UML. (Что касается ссылки, которую вы публикуете, в формальной спецификации нет ничего, что мешало бы вам создать собственный стереотип, называемый абстрактным. Я подробно изложил там ответ.) В общем, если я хочу создать частично абстрактный класс , я бы выделил курсивом имя класса и выделил бы курсивом методы, которые я хотел сделать абстрактными. Или, если бы я хотел сделать это действительно ясным, я бы добавил свойство {abstract} к методам, которые я хотел сделать абстрактными.   -  person BobRodes    schedule 04.01.2015
comment
Я отсылаю вас к спецификации UML Superstructure (2.0) в разделе 18, посвященном профилям. Из этого вы можете видеть, что вы можете создать профиль, в котором вы можете создать абстрактный класс, который расширяет метакласс класса. (На рис. 18.10 показано что-то подобное.) К этому классу можно добавить ограничение, требующее, чтобы некоторые методы были реализованы, а некоторые нет. Это было бы формальным средством определения стереотипа.   -  person BobRodes    schedule 04.01.2015


Ответы (2)


В вашей диаграмме последовательности вы должны использовать только объекты тех типов, которые, как вы знаете, они есть в данный конкретный момент выполнения.

Затем вы вызываете метод для этого объекта, даже если это метод, реализованный в абстрактном родительском классе.

Диаграммы последовательности в своем отношении очень похожи на код.

Предположим, у вас следующая ситуация: Диаграмма классов

Затем вы вызываете обе реализованные операции как абстрактные для объекта ConcreteSubClass, поскольку ваш пользовательский класс имеет связь с ConcreteSubClass, независимо от того, где реализуется операция.

Диаграмма последовательности

Если класс User имел связь с AbstractClass, тогда вы вызываете операции над объектом типа AbstractClass.

person Geert Bellekens    schedule 29.12.2014

Если вы хотите смоделировать два разных класса, то на диаграмме последовательности это будет означать две разные линии жизни. Вот и все (насколько я знаю).

Вы можете отобразить любой <<stereotype>> (включая <<abstract>>) в заголовке линии жизни, как в этом примере: uml-diagrams.org: Примеры диаграмм последовательности UML → Отправить комментарии в Pluck

Например, предположим, что у нас есть этот (бесполезный) код C#:

abstract class BaseClass
{
    protected abstract string Name { get; }

    public virtual void DoSomething()
    {
        Console.WriteLine("Something useful done.");
    }

    protected void SayHello(string to)
    {
        Console.WriteLine("Hi {0}, I'm {1}", to, this.Name);
    }
}

class Case1 : BaseClass
{
    protected override string Name { get { return "Case 1"; } }

    public override void DoSomething()
    {
        base.DoSomething();
    }
}

class Case2 : BaseClass
{
    protected override string Name { get { return "Case 2"; } }

    public void DoSomething(string to)
    {
        this.SayHello(to);
        base.DoSomething();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c1 = new Case1();
        var c2 = new Case2();
        c1.DoSomething();
        c2.DoSomething("Jane");
    }
}

Тогда диаграмма последовательности UML, фиксирующая, что происходит с Program.Main, может выглядеть так:

введите здесь описание изображения

Я нарисовал абстрактный класс как неявный дружественный объект, разделяющий время жизни (и большую часть памяти) с конкретным экземпляром класса. На самом деле так реализовано наследование классов в некоторых языках, поэтому сценарий не является полностью «придуманным».

Однако уровень детализации может быть слишком сосредоточен на реализации, не оставляя места для полезной абстракции. Эта диаграмма не переживет даже небольшой рефакторинг кода.

person xmojmr    schedule 30.12.2014
comment
Объясните мне, какой стандартный стереотип существует для ‹‹create››; это не стереотип, и то, что вы говорите, неверно - ‹‹abstract›› не является стереотипом - IOW, это не представлено так, как вы предлагаете. - person ChiefTwoPencils; 01.01.2015
comment
Пожалуйста, прочтите! - person ChiefTwoPencils; 01.01.2015
comment
Какой инструмент был использован для создания приведенной выше диаграммы? - person ChiefTwoPencils; 01.01.2015
comment
@ChiefTwoPencils Хороший вопрос. Спецификация надстройки UML, версия 2.4.1 в профиле StandardProfileL3 устарела стереотип <<create>> применяется к CallEvent, а вместо этого профиль StandardProfileL2 вводит стереотип <<Create>>, применяемый к BehavioralFeature. Стереотип <<abstract>> взят из профиля UML Эрикссона-Пенкера, и я намеренно использовал его, чтобы подчеркнуть абстрактный характер абстрактного класса, поскольку именно на этом OP хочет явно сосредоточиться - person xmojmr; 01.01.2015