Russian Qt Forum
Ноябрь 25, 2024, 05:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: создание UML-диаграмм?  (Прочитано 22138 раз)
dsp
Гость
« Ответ #15 : Июнь 19, 2011, 22:54 »

я сделал такой вывод
Цитировать
если следовать логие "Если контейнер будет уничтожен, то и включенный объект тоже будет уничтожен", то в Qt одна композиция...?
исходя из этого
Цитировать
Родительский объект при уничтожении автоматически уничтожает все дочерние объекты (правило для всех QObject-наследованных классов).

В Qt же подругому не принято?!!

А в своей программе я следовал только такой логике, значит получается, что у меня везде композиция.
« Последнее редактирование: Июнь 19, 2011, 22:56 от dsp » Записан
dsp
Гость
« Ответ #16 : Июнь 19, 2011, 23:03 »

вру, нифига не так, как я сказал выше.
У меня есть класс главного окна. И есть тулбар с кнопками. Открываю другое окно по кнопке, закрываю основное и окно остается открытым...
Выходит, что это агрегация, а иначе бы все окна закрылись?
Записан
Denjs
Гость
« Ответ #17 : Июнь 20, 2011, 01:12 »

я сделал такой вывод
Цитировать
если следовать логие "Если контейнер будет уничтожен, то и включенный объект тоже будет уничтожен", то в Qt одна композиция...?
исходя из этого
Цитировать
Родительский объект при уничтожении автоматически уничтожает все дочерние объекты (правило для всех QObject-наследованных классов).
В Qt же подругому не принято?!!
Мне почему-то кажется, что вы путаете отношения "родитель-дочерний объект" определенные в системе метаданных Qt (смотри QObject * QObject::parent () const ) и отношения агрегировния/композиции.
Размещение в теле класса ссылки на какой-либо объект ещё не делает "этот" объект родительским, а тот объект - "дочерним".

Дочерним объект станет только после того как вы вызовете у него "void QObject::setParent ( QObject * parent )". И только в этом случае, родительский объект попытается его "автоматически уничтожить" при собственном уничтожении.

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

но в общем случае - объект может содержать множество разных ссылок - и часто не на дочерние объекты - и в этом случае это будет чаще всего агрегация.

PS: А виджет без родителя, кстати, попытается отобразиться как отдельное окно.

У меня есть класс главного окна. И есть тулбар с кнопками. Открываю другое окно по кнопке, закрываю основное и окно остается открытым...
Создание объектом одного класса (А) объекта другого класса (B) - по моему вообще никак не отражается на _диаграмме_классов_.
А и В - это просто разные классы. (поправьте меня?)

а Вот если класс А содержит ссылку на класс В - тогда это уже скорее всего агрегация(если при уничтожении объекта класса А созданный им объект класса В не уничтожается). Но как только вы сделаете "B::setParent(A* parent)" - это будет уже композиция.
« Последнее редактирование: Июнь 20, 2011, 01:24 от Denjs » Записан
Denjs
Гость
« Ответ #18 : Июнь 20, 2011, 01:32 »

в сторону, относительно суровых реалий реальных программ: Важно: это Имхо(!) : на мой взгляд следует выделять (для себя как минимум) особый вид отношений между классами - "ссылка". Когда класс содержит ссылку на объект другого класса, но который логически не объединяется с этим.

т.е. с точки зрения формальной диаграммы - это могла бы быть "агрегация", но которая не означает смысловое объединение объектов друг с другом.

т.е. например это "знания объекта о своем окружении" - что бы вызывать методы других объектов.
важно: Это может быть, и скорее всего будет "не совсем правильно" с точки зрения различных архитектур,  этого стоит избегать при проектировании (держать ссылки на чужие не являющиеся нашей частью объекты) но так на практике часто поступают.

Имхо, такого рода связи можно вообще опустить на диаграмме классов, а будет достаточно просто обозначить их наличие в списке свойств класса с соответствующим типом, но ассоциацию не рисовать - потому что она "не значима" (тонковато-расплывчатое понятие... не ошибитесь - посоветуйтесь с вашим преподавателем об этом) и она просто будет загромождать диаграмму.
« Последнее редактирование: Июнь 20, 2011, 01:35 от Denjs » Записан
dsp
Гость
« Ответ #19 : Июнь 20, 2011, 02:10 »

Спасибо, Denjs, от души - очень познавательно.

Книги книгами: читать их можно много, но человек и его советы зачастую лучше сортируют ту кашу по горшкам =), которая варится в голове.

Постараюсь учесть все ваши замечания и сделать задуманную диаграмму классов.
Что получится, покажу попозже (сегодня).
Записан
dsp
Гость
« Ответ #20 : Июнь 20, 2011, 03:39 »

А какой UML-редактор посоветуете?
Я сейчас пользуюсь http://www.visual-paradigm.com/ Это что-то огромное и перегруженное, меня начинает напрягать.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #21 : Июнь 20, 2011, 11:37 »

Кстати я так и не нашел ни одного нормального редактора умл
Записан
dimen
Гость
« Ответ #22 : Июнь 20, 2011, 15:13 »

Кстати в visual-paradigm есть реверс с++ кода...
Записан
CL0NE
Гость
« Ответ #23 : Июнь 20, 2011, 17:56 »

выше уже упоминали Dia.
к слову, можно сгенерить doxygen'ом XML и скормить его Dia. (для этого должен быть установлен python и в Dia Python plugin)

про примеры: http://uml-diagrams.org/
есть немного примеров
« Последнее редактирование: Июнь 20, 2011, 18:00 от CL0NE » Записан
dsp
Гость
« Ответ #24 : Июнь 20, 2011, 19:33 »

Установил Dia, сейчас буду пробовать делать.
Записан
dsp
Гость
« Ответ #25 : Июнь 21, 2011, 00:02 »

Что-то в Dia не могу найти отношение "композиция", есть только "агрегирование" почему-то.

И еще в Dia есть интересное отношение "источник событий", "приемник событий"  - это можно использовать для обозначения связи слотов и сигналов.
Записан
Denjs
Гость
« Ответ #26 : Июнь 21, 2011, 00:50 »

Что-то в Dia не могу найти отношение "композиция", есть только "агрегирование" почему-то.
В свойствах ассоциации можно выбрать тип включения.
Цитировать
И еще в Dia есть интересное отношение "источник событий", "приемник событий"  - это можно использовать для обозначения связи слотов и сигналов.
Это по моему не к диаграмме классов или объектов... соблюдайте требования нотации и четко понимайте какие элементы вы добавляете на диаграмму.

DIA не требует строго соблюдать ту или иную нотацию, и вы должны понимать, что легко можете нарисовать совершеннейшую "ахинею". Сверяйтесь с описаниями UML, типами диаграмм, способами расширения и решайте можете вы добавить элемент в тот тип даиграммы который вы рисуете, и если можете - то понимайте, это родной элемент данного типа диаграммы, либо расширение нотации (а если расширение - то вы должны понимать расширение/модификация какого основного элемента и как получено)
Записан
dsp
Гость
« Ответ #27 : Июнь 21, 2011, 01:28 »

Цитировать
В свойствах ассоциации можно выбрать тип включения.
нашел

Что-то у меня куча вопросов...
Записан
dsp
Гость
« Ответ #28 : Июнь 21, 2011, 02:11 »


Пусть есть класс главного окна

Код:
#include <QMainWindow>

class Scene3D;
class dbViewer;

class QListWidget;
class QToolBar;
class QAction;
class QTableWidget;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

private slots:
    void aboutSlot();
    void checkPhotoSlot();
    void informationSlot();

private:
    void createToolBar();
    void createActions();
    void createStatusBar();
    void createCheckPointList();
    void createTableWidget();   

    enum { COLUMN = 2 };            // количество колонок на панели

    QTableWidget *checkpointTable;  // панель-таблица со списком контрольных точек
    QAction      *exitAction;
    QAction      *aboutAction;
    QAction      *nextPhotoAction;
    QAction      *previousPhotoAction;
    QAction      *checkerAction;
    QAction      *informationAction;
    QToolBar     *toolBar;   
    Scene3D      *view3D;
    dbViewer     *viewChecker;
};

Код:
#include <QtGui>
#include "mainwindow.h"
#include "dbViewer.h"
#include "scene3D.h"
#include "helpBrowser.h"

MainWindow::MainWindow()
{
    // что бы все было на русском и без закорючек
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

    setWindowTitle("Teleport");

    view3D = new Scene3D;
    viewChecker = new dbViewer;   

    // выводим на форму OpenGL-элементы
    setCentralWidget(view3D);

    // запретить контекстное меню
    setContextMenuPolicy(Qt::NoContextMenu);

    setGeometry(100, 100, 800, 600);

    createActions();
    createToolBar();
    createStatusBar();
    createCheckPointList(); // создаем боковую панель с точками быстрого доступа       

    connect(checkpointTable, SIGNAL(cellDoubleClicked(int,int)), view3D, SLOT(getPhoto(int,int)));
}

void MainWindow::createActions()
{
    exitAction = new QAction(QIcon(":/Icons/exit.png"), "Exit", this);
    exitAction->setStatusTip("Close the program");
    connect(exitAction, SIGNAL(triggered()), SLOT(close()));

    aboutAction = new QAction(QIcon(":/Icons/teleport.png"), "About", this);
    aboutAction->setStatusTip("About this programm");
    connect(aboutAction, SIGNAL(triggered()), SLOT(aboutSlot()));

    checkerAction = new QAction(QIcon(":/Icons/check.png"), "CheckPhoto", this);
    checkerAction->setStatusTip("CheckPhoto...");
    connect(checkerAction, SIGNAL(triggered()), SLOT(checkPhotoSlot()));

    informationAction = new QAction(QIcon(":/Icons/information.png"), "Information", this);
    informationAction->setStatusTip("Informtion about this place...");
    connect(informationAction, SIGNAL(triggered()), SLOT(informationSlot()));
}
...
тут дальше пошла реализация методов и слотов

Этот класс имеет стандартные сигналы и переопределенные слоты.
Как показать на диаграмме это взаимодействие (или это не важно в данном случае)?

Вот исходник Dia:
Записан
Denjs
Гость
« Ответ #29 : Июнь 21, 2011, 13:36 »


Пусть есть класс главного окна

....
Этот класс имеет стандартные сигналы и переопределенные слоты.
Как показать на диаграмме это взаимодействие (или это не важно в данном случае)?

Стандартные сигналы и переопределенные слоты - это не взаимодействие. Это скорее "отношение". Во "взаимодействии" подразумевается понятие времени. В отношении классов "наследование" понятия времени нет.

Так что именно и на какой диаграмме вы хотите показать?
взаимодействие объектов (с упором на порядок вызова) показывается на диаграмме коммуникации((Communication diagram, в UML 1.x — диаграмма кооперации/сотрудничества, collaboration diagram); взаимодейтсвие (с упором на развертку во времени) - диаграмма последовательностей (Sequence diagram)...

отношения классов - на диаграмме классов.

Сигнал-слот связи между объектами - _можно_ отобразить на _модифицированной_ диаграмме объектов (где мы делаем упор на структуру связей, а не на последовательность или порядок вызова - потому это "структурная" диаграмма или "статическая"(отображающую структуру элементов), а не "динамическая"(отображающая поведение элементов).) - я вот так и делал.

_________________________________________________________________
Кстати вот вам книжка : http://dit.isuct.ru/ivt/books/CASE/case11/content.HTM
« Последнее редактирование: Июнь 21, 2011, 13:40 от Denjs » Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.