Ada_Ru форум

Обсуждение языка Ада

Ada и UML

Оставить новое сообщение

Сообщения

Vadim Godunko
Ada и UML
2008-04-16 05:48:50

Доброго времени суток!

 

Очень давно меня мучает один теоретический вопрос отображения моделей UML в Ada. К письму приложена простенькая диаграмма классов, для которой очень хочется сделать отображение на Ada.

 

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

 

Первое приближение можно сделать вот так:

 

with B_Sets;

package A is

type A is new C.C with private;

type A_Access is access all A'Class;

function B (Self : in A) return B_Sets.Set;

end A;

 

with A_Sets;

package B is

type B is new C.C with private;

type B_Access is access all B'Class;

function A (Self : in B) return A_Sets.Set;

end B;

 

with A;

with Sets;

package A_Sets is new Sets (A.A_Access);

 

with B;

with Sets;

package B_Sets is new Sets (B.B_Access);

 

При такой архитектуре возникают печально известные циклические зависимости, недопустимые семантикой языка.

 

У кого есть какие идеи преодоления?

On Wed, Apr 16, 2008 at 09:48:50AM +0400, Vadim Godunko wrote:

У кого есть какие идеи преодоления?

 

А если так?

 

with C;

with B_Sets;

package A is

type A is new C.C with null record;

function B (Self : in A) return B_Sets.BB_Sets.Set;

end A;

 

with C;

with A_Sets;

package B is

type B is new C.C with null record;

function A (Self : in B) return A_Sets.AA_Sets.Set;

end B;

 

limited with A;

with Sets;

package A_Sets is

type A_Access is access all A.A'Class;

package AA_Sets is new Sets (A_Access);

end;

 

limited with B;

with Sets;

package B_Sets is

type B_Access is access all B.B'Class;

package BB_Sets is new Sets (B_Access);

end;

 

 

--

Maxim Reznik

Maxim Reznik wrote:

On Wed, Apr 16, 2008 at 09:48:50AM +0400, Vadim Godunko wrote:

У кого есть какие идеи преодоления?

 

А если так?

 

Отлично!

 

А теперь усложним задачу :-) А именно, необходимо описать Sets таким образом, что бы в нём хранились только ссылки на объекты типов, порождённых от C, и никаких других.

 

Решение "в лоб":

 

generic

type T is abstract new C.C;

type T_Access is access all T'Class;

 

package Sets is

 

опять не проходит из-за той же циклической зависимости :-(

 

(Небольшое пояснение: по задумке Set при добавлении и исключении элементов производит вызовы подпрограмм C'Class.)

 

 

-----Original Message-----

From: Vadim Godunko <vgodunko@...>

To: ada_ru@yahoogroups.com

Date: Wed, 16 Apr 2008 09:48:50 +0400

Subject: [ada_ru] Ada и UML

 

 

Доброго времени суток!

 

Очень давно меня мучает один теоретический вопрос отображения моделей UML в Ada. К письму приложена простенькая диаграмма классов, для которой очень хочется сделать отображение на Ada.

 

Вопрос заключается в отображении ассоциации между ...

...etc...

Добрый день, Вадим! Вдогонку теме вопрос: нет ли такой книженции, где бы UML рассматривался на примерах Ады? Что-то не встретить никак, хоть небезызвестный Буч в книге по UML был в соавторах.

И ещё просьба: есть ли где доступная для Винды рисовалка диаграмм Буча отдельной программой либо интегрированная во что-либо? В MS Visio найти не могу - всё какой-то кошмар попадается, уж лучше в Ворде квадратиками. Стоит вопрос удобного отображения пакетов и задач, не AutoCAD`ом же изощряться...

On Wed, Apr 16, 2008 at 03:25:54PM +0400, Vadim Godunko wrote:

А теперь усложним задачу :-) А именно, необходимо описать Sets таким образом, что бы в нём хранились только ссылки на объекты типов, порождённых от C, и никаких других.

 

 

Есть идея отделить описание состояния Sets от операций в два

настраиваемых пакета:

 

1) Состояние будет хранить любые указатели, что позволит сделать

инстанс от ссылки на limited with/incomplete type и использовать

в круговых зависимостях.

 

2) Операции (добавление/удаление) будут использовать операции от

C'Class, но их можно конкретезировать в теле пакета, где

можно иметь уже (не limited) with и где будет известно, что

ссылка (с которой конкретезировали состояние) на потомок C'Class.

Это звучит несколько запутано, вот пример на нормальном языке:

 

package C is

type C is abstract tagged null record;

procedure On_Add (Item : C) is abstract;

end;

 

limited with A;

with Set_State;

package A_Sets is

type A_Access is access all A.A'Class;

package AA_Sets is new Set_State (A_Access);

end;

 

limited with B;

with Set_State;

package B_Sets is

type B_Access is access all B.B'Class;

package BB_Sets is new Set_State (B_Access);

end;

 

with C;

with B_Sets;

package A is

type A is new C.C with record

B : B_Sets.BB_Sets.Set;

end record;

 

procedure On_Add (Item : A) is null;

end A;

 

with C;

with A_Sets;

package B is

type B is new C.C with record

A : A_Sets.AA_Sets.Set;

end record;

 

procedure On_Add (Item : B) is null;

procedure Some_Action;

end B;

 

generic

type X is private;

package Set_State is

type Set is private;

private

type Node is record

Next : access Node;

Item : X;

end record;

 

type Node_Access is access all Node;

 

type Set is record

Head : Node_Access;

end record;

end;

 

with C;

with Set_State;

generic

type T is abstract new C.C with private;

type T_Access is access all T'Class;

with package State is new Set_State (T_Access);

package Set_Operations is

 

procedure Add (Set : in out State.Set;

Item : in T_Access);

 

end;

 

package body Set_Operations is

 

procedure Add (Set : in out State.Set;

Item : in T_Access)

is

Next : Node_Access := new Node;

begin

Next.Next := Set.Head;

Next.Item := Item;

Set.Head := Next;

On_Add (Item.all);

end;

 

end Set_Operations;

 

with A;

with A_Sets;

with Set_Operations;

package body B is

package S is new Set_Operations

(T => A.A,

T_Access => A_Sets.A_Access,

State => A_Sets.AA_Sets);

 

procedure Some_Action is

A : A_Sets.A_Access;

Object : B;

begin

S.Add (Object.Set, A);

end Some_Action;

end B;

 

 

--------------------------------

 

К сожалению он не компилиться на gnat gpl 2007, хотя, мне кажется, что должен.

 

--

Maxim Reznik

Vladimir Troshin wrote:

 

Добрый день, Вадим! Вдогонку теме вопрос: нет ли такой книженции, где бы UML рассматривался на примерах Ады? Что-то не встретить никак, хоть небезызвестный Буч в книге по UML был в соавторах.

Могу дать сразу два ответа на один вопрос :-)

 

Прямой: нет, такой книги нет.

 

Косвенный: если она появится не рекомендую её читать.

 

:-)

 

Взаимосвязь UML и любого языка программирования очень эфимерна. Как UML модель ляжет на язык программирования зависит от фантазии лиц его использующих. Иногда такое отображение навязывается кем-то или чем-то (обычно авторами конкретных инструменталдьных средств), но это в корне не правильно.

 

Изначальный вопрос имел специфичный контекст, а именно предполагалось создать на Ada библиотеку для обработки UML.

 

:-)

 

И ещё просьба: есть ли где доступная для Винды рисовалка диаграмм Буча отдельной программой либо интегрированная во что-либо? В MS Visio найти не могу - всё какой-то кошмар попадается, уж лучше в Ворде квадратиками. Стоит вопрос удобного отображения пакетов и задач, не AutoCAD`ом же изощряться...

 

Не подскажу, не знаю...

 

Vladimir Troshin wrote:

Доброго времени суток!

 

Очень давно меня мучает один теоретический вопрос отображения моделей UML в Ada. К письму приложена простенькая диаграмма классов, для которой очень хочется сделать отображение на Ada.

 

Вопрос заключается в отображении ассоциации между ... ...etc... Добрый день, Вадим! Вдогонку теме вопрос: нет ли такой книженции, где бы UML рассматривался на примерах Ады? Что-то не встретить никак, хоть небезызвестный Буч в книге по UML был в соавторах.

И ещё просьба: есть ли где доступная для Винды рисовалка диаграмм Буча отдельной программой либо интегрированная во что-либо? В MS Visio найти не могу - всё какой-то кошмар попадается, уж лучше в Ворде квадратиками. Стоит вопрос удобного отображения пакетов и задач, не AutoCAD`ом же изощряться...

 

------------------------------------

UML редактор есть в NetBeans 6.0: http://www.netbeans.org/

Также есть бесплатная UML-рисовалка Umlet: http://www.umlet.com/

Vadim Godunko пишет:

 

Изначальный вопрос имел специфичный контекст, а именно предполагалось создать на Ada библиотеку для обработки UML.

Вроде dia2code, только на Аде?

 

[1] Dia2Code Features

http://dia2code.sourceforge.net/features.html

[2] Dia2Code Hack

http://adrianhoe.com/adrianhoe/projects/

 

-- If you want to get to the top, you have to start at the bottom

Иван Левашев wrote:

Vadim Godunko пишет:

 

Изначальный вопрос имел специфичный контекст, а именно предполагалось создать на Ada библиотеку для обработки UML.

Вроде dia2code, только на Аде?

 

Скорее нет, чем да. Идея именно в обработке UML моделей, т.е. выполенения чтения/записи и редактирования. Генерация кода это вещь сугубо специфичная для конкретного проекта, поэтому в явном виде делать её бесполезно, но библиотека позволит упростить эту задачу. Ну а в будущем можно будет и полноценный UML редактор сделать :-)

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти