2016-11-04 7 views
2

Чтобы создать код, я рисую диаграмму типа UML. У меня есть некоторые общие объекты, и мне интересно, как это должно быть нарисовано, поскольку владение этими объектами действительно разделяется. Чтобы быть более конкретным здесь пример C++, что происходит:Как представить общие объекты в 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(); 
}; 

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

+0

Почему 'B' необходимо предоставить совместное владение' CSharedObj'? Время жизни 'B' совпадает с временем жизни' A', чтобы он мог безопасно иметь указатель, не являющийся владельцем 'CSharedObj', нет? –

+0

То, что вы говорите, теоретически правильно, но архитектура немного сложнее, чем пример выше. Идея состоит в том, что A создает все необходимое и распределяет его по каждому подкомпоненту (скажем, мы имеем B1, B2, B3, ..., Bn, совместно использующие ресурсы, созданные A). Вы не хотите создавать несколько ресурсов, поскольку они имеют отношение 1 к 1 с аппаратными модулями, но не нужно хранить их в A, поскольку они ничего не делают с ними, кроме инициализации и перехода к Bi. –

+0

Хорошо, если есть более одного 'B', что имеет больше смысла, и я не заметил, что' A' не хранит общий объект. –

ответ

2

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

enter image description here

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

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

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

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

enter image description here

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

+0

Ну, 'CSharedObject' - это то, что имя говорит: объект. Не класс. Вы счастливо смешиваете классы и объекты, как если бы все были классами. –

+0

@ThomasKilian; Давно я развился в C++, но я думаю, что это класс. См. Пример в http://en.cppreference.com/w/cpp/memory/shared_ptr. Это хорошее соглашение об именах, чтобы назвать класс после того, как это происходит, когда он создается. Например, «Человек» является хорошим именем для класса, хотя каждое Лицо является объектом. –

+0

Класс определяется после ключевого слова 'class'. OP ошибочно использует класс слова, где подразумевается экземпляр. –

 Смежные вопросы

  • Нет связанных вопросов^_^