Как представить общие объекты в UML?

Чтобы разработать свой код, я рисую диаграмму классов UML. У меня есть несколько общих объектов, и мне интересно, как это должно быть нарисовано, поскольку право собственности на эти объекты действительно совместное. Чтобы быть более конкретным, здесь приведен пример С++ того, что происходит:

class A
{
public:
  A(){
    std::shared_ptr<CSharedObj> sharedObj = std::make_shared<CSharedObj>;
    mB = B(sharedObj);
  }
private:
  B mB;
};

class B
{
public:
  B(std::shared_ptr<CSharedObj>);
private:
  std::shared_ptr<CSharedObj> mSharedObj;
};

class CSharedObj
{
public:
  CSharedObj();
};

Как представить на диаграмме классов отношения между этими тремя классами?


person San Mosy    schedule 04.11.2016    source источник
comment
Почему B нужно совместное владение CSharedObj? Время жизни B такое же, как и время жизни A, поэтому он может безопасно иметь невладеющий указатель на CSharedObj, не так ли?   -  person Chris Drew    schedule 04.11.2016
comment
То, что вы говорите, теоретически правильно, но архитектура немного сложнее, чем в примере выше. Идея состоит в том, что A создает все, что нужно, и распределяет это по каждому подкомпоненту (скажем, у нас есть B1, B2, B3, ..., Bn, разделяющие некоторые ресурсы, созданные A). Вы не хотите создавать несколько ресурсов, так как они имеют отношения 1-к-1 с аппаратными модулями, но также нет необходимости хранить их в A, так как он ничего с ними не делает, кроме инициализации и передачи в Bi.   -  person San Mosy    schedule 04.11.2016
comment
Хорошо, если есть более одного B, это имеет больше смысла, и я не заметил, что A не хранит общий объект.   -  person Chris Drew    schedule 04.11.2016
comment
Где вы видите 3 класса? Их всего два, а именно A и B.   -  person qwerty_so    schedule 06.11.2016
comment
Третий класс — CSharedObject. Я не стал писать определение, потому что оно было бы тривиальным (class CSharedObject {};) и уже ясно, что это тип, а не экземпляр, так как это аргумент шаблона shared_ptr.   -  person San Mosy    schedule 09.11.2016


Ответы (1)


UML не определяет, как именно этот фрагмент кода C++ должен быть отражен на диаграмме. Есть несколько вариантов, и вот мое предложение:

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

Я использовал композицию (закрашенный ромб) для mB, потому что экземпляр B уничтожается, когда уничтожается закрывающий его экземпляр A.

Поскольку экземпляр CSharedObject потенциально может совместно использоваться несколькими объектами-владельцами, я использовал совместное агрегирование (открытый ромб) для mSharedObj. Во всем проекте вы можете установить соглашение, согласно которому объекты, на которые указывает shared_ptr, представляются на диаграммах классов с использованием общего отношения агрегации.

Обратите внимание, что эта диаграмма классов не указывает, что экземпляр CSharedObject, созданный A, является тем же экземпляром, на который указывает mSharedObj. Если вы хотите, вы можете добавить примечание, чтобы описать этот факт.

Если вы действительно хотите показать shared_ptr на своей диаграмме, вы можете сделать это следующим образом:

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

Дополнительную информацию о шаблонных классификаторах см. в разделе 9.3 спецификации UML 2.5.

person www.admiraalit.nl    schedule 05.11.2016
comment
Что ж, CSharedObject — это то, о чем говорит название: объект. Не класс. Вы с удовольствием смешиваете классы и объекты, как если бы все они были классами. - person qwerty_so; 06.11.2016
comment
Класс определяется после ключевого слова class. ОП неправильно использует слово «класс», где имеется в виду экземпляр. - person qwerty_so; 06.11.2016
comment
@ThomasKilian, объявление класса CSharedObject отсутствует в этом фрагменте кода, но я ожидаю, что полное рабочее приложение имеет это объявление где-то в исходном коде. - person www.admiraalit.nl; 06.11.2016
comment
Думаю, я знаю, что вы имеете в виду :-/ Пожалуйста, отредактируйте свой ответ, чтобы я мог изменить свое голосование. - person qwerty_so; 06.11.2016