Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: генерация кода по uml-схеме  (Прочитано 19783 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 08-10-2008 14:29 » 

у меня тормоз: например, есть 2 класса, связанные между собой отношением композиции:

MyDialog <>---------MyEdit  ( <> должен быть черным Ага )
                  1         1...*

Т.о. что я ожидаю при генерации? Мое предположение:
Код:
	class MyDialog
{
MyDialog();
// chto-to eshhe

MyEdit m_Edit;
};

Я права или как?  Отлично
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #1 : 08-10-2008 14:37 » 

Ой, сейчас увидела, что неверно изобразила линию - он адолжна быть сплошной..

Ну и тогда туда же, т.к. до конца не вижу разницы при генерации кода (пардон за тупость) - как будет выглядеть код при таком соотношении как:

1) ассоциация

MyDialog __________> MyEdit
            1         1...*

2) агрегация

MyDialog <>_______MyEdit 
                  1         1...*
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-10-2008 14:45 » 

Ирина, у тебя кратность композиции 1..*
поэтому должен быть список объектов типа MyEdit

Код:
vector<MyEdit> m_Editors;
« Последнее редактирование: 08-10-2008 14:51 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 08-10-2008 14:52 » 

Ирина, не умничай, покажи пальцем (с) Улыбаюсь

(или просвети меня, темноту, о чём речь... )
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 08-10-2008 15:01 » new

npak,

согласна, спасибо за поправку!
Но главное - при композиции это должен быть непременно мембер класса или нет?

проблема в следующем:
я раньше никогда не пользовалась генерацией кода по схеме, а сейчас попала в проект, где это делают (правда, они решили обойтись малыми деньгами и вместо rational rose используют rhapsody - судя по нервным откликам коллег это катастрофа, т.к. нет никаких обычных книг, а хелп практически непригоден).
Ну и соответственно хочу срочно понять что к чему Ага А тут еще ребята усложнили все, что было возможно, и повводили кучу макросов в код (а где код этих макросов, я пока не знаю), поэтому просто сделать схемку и посмотреть что к чему, возможным не представляется...

Леш,
ежели б сама знала Ага
Смотри, например ты можешь зайти в rational rose, сделать схему проекта в uml-е, нарисовав все свои классы со всеми их мемберами и функциями, и указав, кто с кем и как связан. Затем нажать на кнопку "генерировать код" и получишь скелет программки со всеми .h и .cpp, т.е. сэкономишь кучу времени (если умеешь быстро рисовать схемки Ага )

Вот я и пытаюсь понять, что будет сгенерировано в различных случаях.


Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 08-10-2008 15:03 » 

Malaja, права, но не совсем. Множественность объектов MyEdit обозначена как 1..* - значит членом MyDialog будет не объект MyEdit, а коллекция объектов MyEdit. Скорее всего, вспомогательный класс.

И вот тут начинаются проблемы с генерацией кода Улыбаюсь Поскольку про коллекцию в диаграмме ничего не сказано. Тогда нужно конфигурировать генератор кода так, что в случае отношения "1 ко многим" автоматически задавалась какая-то определённая реализация коллекции. Отношения же "многие ко многим" вовсе запретить.

Судя по точке с запятой в конце декларации класса речь идёт о C++. В этом случае множественность "0..1" должна задаваться через указатель с допустимым значением NULL.

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

Кроме того, реализация композиции или агрегации (отношений типа "часть и целое") никак не ограничивается тем, что ссылка на "часть" непременно хранится в "целом". Это лишь разновидность ассоциации, в которой направление доступа обозначается стрелкой. Никто не мешает "частям" хранить ссылки на "целое", при этом с точки зрения логики системы их значение (часть или целое) в отношении сохраняются.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-10-2008 15:10 » 

Насколько я помню, агрегация - это включение в инстанс независимых объектов, а композиция ограничивает время жизни вложенных объектов временем жизни контейнера.

То есть агрегацию можно генерировать как вектор ссылок. После удаления контейнера сами вложенные объекты останутся живы.
Код:
vector<MyEdit&> m_AggregatedEditors;

Композицию как вектор инстансов. После удаления диалога будут удалены все редакторы.
Код:
vector<MyEdit> m_CompositionEditors;

Есть небольшой трюк - vector<> дает кратность отношения 0..*, поэтому нужно в конструкторе предусмотреть создание хотя бы одного редактора
« Последнее редактирование: 08-10-2008 15:23 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-10-2008 15:17 » 

Смотри, например ты можешь зайти в rational rose, сделать схему проекта в uml-е, нарисовав все свои классы со всеми их мемберами и функциями, и указав, кто с кем и как связан. Затем нажать на кнопку "генерировать код" и получишь скелет программки со всеми .h и .cpp, т.е. сэкономишь кучу времени (если умеешь быстро рисовать схемки Ага )

Ню-ню, как сказал бы мой одногруппник, который однажды работал в проекте с генерацией кода из UML. Для одноразовой генерации это может прокатить. Однако на практике после генерации нужно дописывать, переписывать и как-то модифицировать сгенерированный код. Из-за того, что генерируется ... гм, скажем так ... убожество.

Теперь представь - захотелось внести изменения в картинку. Внесла, сгенерировала классы снова. Вопрос - как перенести ручные изменения в новый код?

Сколько я видел попыток внедрить UML в процесс разработки, нигде люди не выдерживали "идеологической чистоты". Обкладывали матом розу, кодогенератор и лично Гради Буча, переписывали всё ручками, а для отчетов начальству постфактум рисовали красивые диаграммки.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 08-10-2008 15:23 » 

dimka,

стоп, не так быстро! Ага

На данный момент вид коллекции меня еще мало волнует Ага Точнее, у них запрет на stl, все должно быть на стандартном c++, поэтому это пока для самая маленькая проблема Ага
Сначала надо понять основу.

Т.е. получается, что в принципе я была права, когда сказала, что элемент (ы) типа MyEdit должен быть мембером класса MyDialog, а не переменной, область видимости которой где-то в какой-то функции. и все это вне зависимости от типа связи? Так?

А разница, видимо, в том, что при композиции хранящиеся в MyDialog объекты типа MyEdit должны быть уничтожены при вызове деструктора класса MyDialog, а при  агрегации и ассоцоации - нет. Так?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #9 : 08-10-2008 15:28 » 

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

А по поводу генерации - пока ничего не могу сказать, т.к. сижу тут всего пару дней.
Для меня это тоже всегда было вопросом вопросов, когда я слышала, что кто-то что-то генерирует, причем не только по поервому заходу.

Насколько я успела увидеть, тут принцип таков - они и сами функции пишут фактически тут же в туле, а потом опять стартуют генерацию кода, поэтому у них тут все централизовано.
Вопорос в том, насколько все это удобно...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 08-10-2008 15:51 » 

Цитата: npack
Насколько я помню, агрегация - это включение в инстанс независимых объектов, а композиция ограничивает время жизни вложенных объектов временем жизни контейнера.
И на положение ссылок это не влияет: можно в разных направлениях делать. Хотя, конечно, как правило "целое" содержит ссылки на "части".

Цитата: Malaja
Т.е. получается, что в принципе я была права, когда сказала, что элемент (ы) типа MyEdit должен быть мембером класса MyDialog, а не переменной, область видимости которой где-то в какой-то функции. и все это вне зависимости от типа связи? Так?
Пожалуй да... Если объект не член класса, а просто используется внутри метода, то это будет скорее зависимость, чем ассоциация.

Цитата: Malaja
А разница, видимо, в том, что при композиции хранящиеся в MyDialog объекты типа MyEdit должны быть уничтожены при вызове деструктора класса MyDialog, а при  агрегации и ассоцоации - нет. Так?
На уровне логики это не определяется Улыбаюсь Композиция описывает отношение между "целым" и его неотъемлемыми частями. Как человек и голова Улыбаюсь А агрегация - более слабое отношение, как светильник и лампочка.

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

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #11 : 08-10-2008 15:58 » 

dimka,

понятно, спасибочки!

Еще раз огромное всем спасибо за объяснения!  Да-да
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 08-10-2008 16:00 » 

Ирин, ой, сколько незнакомых словов ))
Что есть rational rose и для чего оно ? И почему это экономит время ?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 08-10-2008 16:14 » 

Алексей1153++, http://ru.wikipedia.org/wiki/UML
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 08-10-2008 16:46 » 

Да, имел я сомнительное удовольствие писать код во внешнем туле. Это возможно, если инструмент хорошо интегрирован с компилятором и отладчиком. Если нет, то проще выкинуть его нахрен, написать и отладить код в нормальных инструментах, а потом нарисовать диаграммку обратно
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Вахмурка
Помогающий

ru
Offline Offline
Пол: Мужской
Программист


WWW
« Ответ #15 : 08-10-2008 17:30 » 

 А я никогда не пользовался генераций кода по UML схеме. Использую UML только для анализа, и так что б чего не забыть.
Да из диаграммы классов (как я понял в данном случае) генерировать код, невелика выгода, ручками можно быстрее написать.
« Последнее редактирование: 08-10-2008 17:36 от Вахмурка » Записан

Программа – это мысли спрессованные в код.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #16 : 09-10-2008 08:50 » 

Ой, Леш, прости - вчера меня поймали на совещание (я же новая, их расписания художественного трепа еще не знаю), отвертеться не удалось ;-( Ну а потом уже свалить побыстрее захотелось Ага

Этот самый rose - инструмент, в котором можно строить различные uml-схемки (насколько я поняла, наиболее распространенными являются диаграммы классов и диаграммы последовательностей). Посмотри тут: http://www.intuit.ru/department/se/ibmrrose/ - это весьма неплохой краткий курс молодого бойца по построению таких схемок в rose.
Опять же там можно сделать схемку всех классов и затем сгенерировать код (якобы ручками это будет дольше и не так аккуратно). Практического опыта не имею, поэтому ничего сказать пока не могу.

npak,

слушай, я очень сильно подозреваю, что ты прав на все 100 Ага Но у местного начальства другое мнение... да и тул еще кривой и хреновый, но зело дешевый по сравнению с другими... Я видела, как он компилирует - это финиш... Т.е. он подключает компилятор студии, но идет только до 1-ой ошибки, после чего откключается... исправляешь ошибку и опять стартуешь процесс компиляции... Плюс все это длится несуразно долго по сравнению со студией...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines