Разработка встроенного модуля среды Rational Rose для автоматизированного преобразования диаграмм деятельностей в диаграммы Use case
Методы моделирования в системе Rational Rose, требования, предъявляемые к разрабатываемой системе. Выбор средства для реализации поставленной задачи и особенности интегрированной среды разработки Borland Delphi 5. Возможности отладчика ИСР Delphi 5.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 21.11.2010 |
Размер файла | 460,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Разработанное приложение позволяет существенно упростить процесс проектирования автоматизированных систем на стадии бизнес- моделирования и анализа требований. Это достигается за счет автоматизации процесса преобразования описания бизнес-процессов в функциональные требования к системе и отражения их на диаграммах Use-Case. Такая технология позволяет также сократить количество ошибок на ранних стадиях проектирования системы.
Методика преобразования диаграмм была использована в проекте автоматизации электролампового завода, где подтвердилась ее эффективность, и в настоящее время активно используется в других проектах.
Приложения
unit Structura;
{Модуль содержит описание структуры классов, с помощью которых
осуществляется преобразование данных
Автор - Хабибрахманов М.А.
Последняя модификация - 12.04.2001}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleServer, RationalRose_TLB;
Type
{$M+}
TDiagramm = class(TObject)
public
Name: String;
Departs: TList;
SubDiagram : TDiagramm;
constructor Create;
procedure AddDeparts(var ActivColl: TRoseActivityCollection);
procedure MakeCategories(var UseCaseCat : TRoseCategory);
end;
TDepart = class(TObject)
public
Name: String;
UseCases: TList;
Actors: TStringList;
SuperDepart : String;
constructor Create;
procedure AddData(var Activ: TRoseActivity);
procedure MakeActorsAndUC(var UseCaseCat : TRoseCategory; var Diagram : TRoseClassDiagram);
end;
TUseCase = class(TObject)
public
Name: String;
Documents: TStringList;
SubDiagramm: TDiagramm;
constructor Create;
procedure AddDocuments(var Activ: TRoseAbstractState{TRoseActivity});
procedure AddSubDiagramm(var AbState :TRoseAbstractState{Activ: TRoseActivity});
procedure MakeUseCase(var UseCaseCat: TRoseCategory; var Diagram : TRoseClassDiagram);
procedure MakeSubCategories(var UseCaseCat: TRoseCategory);
end;
var
g_category_name : string;
g_Department : string;
g_Actor : string;
g_Use_case : string;
g_Document : string;
Function CompNAME(fild,stereo:string):boolean;
implementation
constructor TDiagramm.Create;
Begin
Inherited Create;
Departs := TList.Create;
//SubDiagram := TDiagramm.Create;
end;
constructor TDepart.Create;
Begin
Inherited Create;
UseCases := TList.Create;
Actors := TStringList.Create;
end;
constructor TUseCase.Create;
Begin
Inherited Create;
Documents := TStringList.Create;
SubDiagramm := TDiagramm.Create;
end;
procedure TDiagramm.AddDeparts(var ActivColl: TRoseActivityCollection);
var i : integer;
activ : TRoseActivity;
Depart: TDepart;
NewDiag : TDiagramm;
SubActivColl: TRoseActivityCollection;
begin
activ := TRoseActivity.Create(nil);
SubActivColl:= TRoseActivityCollection.Create(nil);
for i:=1 to activcoll.Count do
begin
activ.ConnectTo(activcoll.getat(i));
if compname(G_department,{Ansi}LowerCase(activ.Stereotype)) then
begin
depart := TDepart.Create;
depart.Name := Activ.Name;
depart.AddData(activ);
Departs.Add(depart);
end;
if compname(g_use_case,LowerCase(activ.Stereotype)) and (activ.SubActivities.Count<>0) then
begin
SubDiagram := TDiagramm.Create;
//showmessage(activ.name);
//newDiag := Tdiagramm.Create;
SubActivColl.ConnectTo(activ.SubActivities);
SubDiagram.AddDeparts(SubActivColl);
end;
end;
activ.Disconnect;
activ.Free;
SubActivColl.Disconnect;
SubActivColl.Free;
end;
procedure TDiagramm.MakeCategories(var UseCaseCat : TRoseCategory);
var i : integer;
depart: tdepart;
Category: TRoseCategory;
Diag: TRoseClassDiagram;
RootDiagramm: iRoseClassDiagram;
SubCategory: iRoseCategory;
begin
try
depart := TDepart.Create;
category := TRoseCategory.Create(nil);
diag := TRoseClassDiagram.Create(nil);
if (SubDiagram = nil) then
rootdiagramm := Usecasecat.ClassDiagrams.GetFirst('Main')
else
RootDiagramm := UseCasecat.AddClassDiagram('Main');
for i:=0 to Departs.Count-1 do
begin
depart := Departs.items[i];
//category.ConnectTo(Usecasecat.AddCategory(depart.Name));
SubCategory := Usecasecat.AddCategory(depart.Name);
RootDiagramm.AddCategory(SubCategory);
category.ConnectTo(SubCategory);
Diag.ConnectTo(Category.AddClassDiagram(Depart.Name));
depart.MakeActorsAndUC(category,diag);
end;
diag.Disconnect;
diag.Free;
category.Disconnect;
category.Free;
except
end;
if not(SubDiagram = nil) then
SubDiagram.MakeCategories(UseCasecat);
end;
procedure TUseCase.AddDocuments(var Activ: TRoseAbstractState{RoseActivity});
var k : integer;
Begin
if activ.Transitions.Count <>0 then
begin
for k:=1 to activ.Transitions.Count do
begin
if compname(g_document,{Ansi}LowerCase(activ.Transitions.GetAt(k).GetSupplier.Stereotype)) then
documents.add(activ.Transitions.GetAt(k).GetSupplier.Name);
if compname(G_document,{Ansi}LowerCase(activ.Transitions.GetAt(k).GetClient.Stereotype)) then
documents.add(activ.Transitions.GetAt(k).GetClient.Name);
end;
end;
end;
procedure TUseCase.AddSubDiagramm(var AbState :TRoseAbstractState{Activ: TRoseActivity});
var SAC : TRoseActivityCollection;
rosi: troseitemcollection;
ast: troseabstractstatecollection;
begin
sac := TRoseActivityCollection.Create(nil);
sac.ConnectTo(abstate.SubActivities);
//sac.
//ast.ConnectTo(activ.SubActivities as iroseabstractstatecollection);
if abstate.SubActivities.Count <> 0 then
begin
Subdiagramm.Name := 'Детализация '+Name;
Subdiagramm.AddDeparts(sac);
end;
sac.Disconnect;
sac.Free;
end;
procedure TUseCase.MakeUseCase(var UseCaseCat: TRoseCategory; var Diagram : TRoseClassDiagram);
var i,j : integer;
UC: TRoseUseCase;
DocClass : IRoseClass;
ClassDiag: TRoseClassDiagram;
begin
UC:= TRoseUseCase.Create(nil);
//diagram.AddUseCase(UseCaseCat.AddUseCase(Name));
ClassDiag:= TRoseClassDiagram.Create(nil);
UC.ConnectTo(diagram.GetUseCases.GetAt(diagram.GetUseCases.Count));
classDiag.ConnectTo(UC.AddClassDiagram('Документы '+Name));
if documents.Count<>0 then
for i:=0 to documents.Count-1 do
begin
try
DocClass := UseCaseCat.AddClass(documents.strings[i]{+inttostr(i)+name});
classDiag.AddClass(DocClass{UseCaseCat.AddClass(documents.strings[i]+inttostr(i)+name)});
except
for j:=1 to usecasecat.GetAllClasses.Count do
begin
Docclass := usecasecat.GetAllClasses.GetAt(j);
if docclass.Name = documents.strings[i] then
classDiag.AddClass(DocClass);
end;
end;
end;
UC.Disconnect;
UC.Free;
ClassDiag.Disconnect;
ClassDiag.Free;
end;
procedure TUseCase.MakeSubCategories(var UseCaseCat: TRoseCategory);
var cat : TRoseCategory;
begin
cat := TRoseCategory.Create(nil);
if Subdiagramm.name <> '' then
begin
cat.connectto(UseCaseCat.AddCategory(Subdiagramm.name));
Subdiagramm.MakeCategories(cat);
end;
end;
procedure TDepart.AddData(var Activ: TRoseActivity);
var k : integer;
UC : TUseCase;
UCA : TRoseActivity;
RState : TROseStateVertex;
ras:troseabstractstate;
isv:irosestatevertex;
irAbs:iroseabstractstate;
begin
ras := troseabstractstate.Create(nil);
if activ.Transitions.Count <>0 then
begin
for k:=1 to activ.Transitions.Count do
begin
if compname(G_actor,{Ansi}LowerCase(activ.Transitions.GetAt(k).GetSupplier.Stereotype)) then
actors.add(activ.Transitions.GetAt(k).GetSupplier.Name);
if compname(g_use_case,{Ansi}LowerCase(activ.Transitions.GetAt(k).GetSupplier.Stereotype)) then
begin
UC := TUseCase.Create;
UC.Name := activ.Transitions.GetAt(k).GetSupplier.Name;
isv:= activ.Transitions.GetAt(k).GetSupplier as irosestatevertex;
irAbs:= isv as iroseabstractstate;
ras.ConnectTo(irabs);
UC.AddDocuments(RAS);
UC.AddSubDiagramm(RAS);
UseCases.add(UC);
end;
end;
RAS.Disconnect;
RAS.Free;
end;
procedure TDepart.MakeActorsAndUC(var UseCaseCat : TRoseCategory; var Diagram : TRoseClassDiagram);
var i,j,k: integer;
UC: TUseCase;
RoseClass : TRoseClass;
iRoseAss : IroseAssociation;
SubCat : TRoseCategory;
iSubCat : iRoseCategory;
SubDiagram : TRoseClassDiagram;
iUseCase : iRoseUseCase;
flag : boolean;
begin
UC := TUseCase.Create;
SubCat := TRoseCategory.Create(nil) ;
RoseClass := TRoseClass.Create(nil);
SubDiagram := TRoseClassDiagram.Create(nil);
{if usecases.Count<>0 then
begin
for i:=0 to usecases.Count-1 do
begin
uc := usecases.items[i];
uc.MakeUseCase(UseCaseCat,Diagram);
uc.MakeSubCategories(UseCaseCat);
end;
end; }
if actors.Count<>0 then
for i:=0 to actors.Count-1 do
begin
try
iSubCat := UseCasecat.AddCategory('Функции ' + actors.strings[i]);
diagram.AddCategory(isubcat);
SubCat.ConnectTo(iSubCat);
//Usecasecat:= SubCat;
SubDiagram.ConnectTo(SubCat.AddClassDiagram('Функции ' + actors.strings[i]));
SubDiagram.AddClass(SubCat.AddClass(actors.strings[i]{+inttostr(i)}));
RoseClass.ConnectTo(SubDiagram.GetClasses.GetAt(SubDiagram.GetClasses.Count));
RoseClass.Stereotype:='actor';
{Установка связей}
if usecases.Count<>0 then
begin
for j:=0 to usecases.Count-1 do
begin
uc := usecases.items[j];
subdiagram.AddUseCase(SubCat.AddUseCase(UC.Name+inttostr(i)));
//showmessage(inttostr(subdiagram.GetAssociations.Count));
iUseCase := SubDiagram.GetUseCases.GetAt(SubDiagram.GetUseCases.count);
IroseAss := RoseClass.AddAssociation('','');
// showmessage(inttostr(roseclass.GetAssociations.Count));
//iroseass.LinkClass:= SubDiagram.GetClasses.GetAt(SubDiagram.GetClasses.Count);
// iroseass.Role1. :=SubDiagram.GetClasses.GetAt(SubDiagram.GetClasses.Count).GetRoseItem ;
iroseass.Role1.SupplierName:=iUseCase.Name;
// iroseass.SetRoleForNameDirection(iroseass.Role2);
subdiagram.AddAssociation(iroseass);
iusecase.Name := uc.Name;
uc.MakeUseCase(SubCat,SubDiagram);
uc.MakeSubCategories(SubCat);
end;
end;
{Конец Установка связей}
RoseClass.Disconnect;
Subdiagram.Disconnect;
Subcat.Disconnect;
except
//UseCasecat.DeleteCategory(iSubCat);
end;
end;
RoseClass.Disconnect;
RoseClass.Free;
Subdiagram.Disconnect;
Subdiagram.Free;
Subcat.Disconnect;
Subcat.free;
Uc.Free;
end;
Function CompNAME(fild,stereo:string):boolean;
var
c:string;
i,j:integer;
begin
i:=1;
//for j:=1 to n_of_item do begin
c:='';
result:=false;
repeat
// i:=i+1;
c:=c+fild[i];
i:=i+1;
if fild[i]=',' then
begin
if c = stereo then
begin
result:= true;
exit;
end
else
begin
c:='';
i:=I+1;
end;
end;
if i>=length(fild) then
begin
c:=c+fild[i];
if c = stereo then result:= true;
exit;
end;
until (i>=length(fild));
//if C='' then showmessage('djdfjfjfk');
end;
end.
unit Action;
{Модуль содержит описание интерфейса пользователя
Автор - Хабибрахманов М.А.
Последняя модификация - 06.04.2001}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleServer, RationalRose_TLB, Structura, Menus, ComCtrls, Registry;
type
TTransForm = class(TForm)
RoseActivity1: TRoseActivity;
RoseApplication1: TRoseApplication;
Memo1: TMemo;
RoseActivity2: TRoseActivity;
StatusBar1: TStatusBar;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
TransForm: TTransForm;
a: iroseusecase;
swml:TRoseSwimLane;
AllActivity:tlist;
diag: tdiagramm;
actcoll: Troseactivitycollection;
categor:TRoseCategory;
reg : Tregistry;
implementation
uses About, Dialog1;
{$R *.DFM}
procedure TTransForm.Button1Click(Sender: TObject);
var
ind :integer;
begin
try
try
button1.Enabled := false;
button2.Enabled := false;
Structura.g_category_name := Edit1.Text;
Structura.g_Department := Edit2.Text;
Structura.g_Actor := Edit3.Text;
Structura.g_Use_case := Edit4.Text;
Structura.g_Document := Edit5.Text;
RoseApplication1.visible:=false;
StatusBar1.Panels[0].Text := 'Идет преобразование';
Transform.Refresh;
{создание образа}
categor := TRoseCategory.Create(nil);
diag:= Tdiagramm.Create;
actcoll:=Troseactivitycollection.Create(nil);
actcoll.ConnectTo(roseapplication1.currentmodel.RootUseCaseCategory.StateMachineOwner.StateMachines.getat(1).activities);
diaG.AddDeparts(actcoll);
diag.Name := roseapplication1.currentmodel.RootUseCaseCategory.StateMachineOwner.StateMachines.getat(1).name;
if roseapplication1.currentmodel.RootUseCaseCategory.Categories.FindFirst(g_category_name)= 0
then
begin
//showmessage('Не существует');
categor.ConnectTo(roseapplication1.currentmodel.RootUseCaseCategory.AddCategory(g_category_name));
end
else
begin
ExsistDlg.showmodal;
if ExsistDlg.Status =1 then
begin
ind:=roseapplication1.currentmodel.RootUseCaseCategory.Categories.FindFirst(g_category_name);
categor.ConnectTo(roseapplication1.currentmodel.RootUseCaseCategory.Categories.getat(ind));
end
else
begin
ind:=roseapplication1.currentmodel.RootUseCaseCategory.Categories.FindFirst(g_category_name);
//categor.ConnectTo(roseapplication1.currentmodel.RootUseCaseCategory.Categories.getat(ind));
roseapplication1.currentmodel.RootUseCaseCategory.DeleteCategory(roseapplication1.currentmodel.RootUseCaseCategory.Categories.getat(ind));
//roseapplication1.currentmodel.RootUseCaseCategory.Categories.Remove(roseapplication1.currentmodel.RootUseCaseCategory.Categories.getat(ind));
categor.ConnectTo(roseapplication1.currentmodel.RootUseCaseCategory.AddCategory(g_category_name));
end;
end;
diag.MakeCategories(categor);
Categor.Disconnect;
Categor.Free;
//N3.Enabled := false;
StatusBar1.Panels[0].Text := 'Готово';
finally
RoseApplication1.visible:=true;
Close;
end;
except
ShowMessage('Ошибка преобразования');
//StatusBar1.Panels[0].Text := 'Ошибка преобразования';
end;
end;
procedure TTransForm.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TTransForm.FormShow(Sender: TObject);
begin
reg := Tregistry.Create;
reg.OpenKey('Software\Rational Software\Rose\Conv',true);
//showmessage(reg.CurrentPath);
//reg.GetValueNames(memo2.Lines);
if reg.HasSubKeys then showmessage('!!!!!');
//reg.GetDataInfo('Product Feature',rr);
//showmessage(reg.ReadString('Actor'));
edit2.Text:=reg.ReadString('Department');
edit3.text:=reg.ReadString('Actor');
edit4.Text := reg.ReadString('Use_case');
edit5.Text := reg.ReadString('Document');
//reg.WriteString('Department','Dep1');
end;
procedure TTransForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
reg.WriteString('Department',edit2.Text);
reg.WriteString('Actor',edit3.text);
reg.WriteString('Use_case',edit4.Text);
reg.WriteString('Document',edit5.Text);
end;
end.
unit Dialog1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TExsistDlg = class(TForm)
OkButton: TButton;
CancelBtn: TButton;
RadioGroup1: TRadioGroup;
//property Pstatus
procedure CancelBtnClick(Sender: TObject);
procedure OkButtonClick(Sender: TObject);
private
{ Private declarations }
public
Status : integer;
{ Public declarations }
end;
var
ExsistDlg: TExsistDlg;
implementation
{$R *.DFM}
procedure TExsistDlg.CancelBtnClick(Sender: TObject);
begin
close;
end;
procedure TExsistDlg.OkButtonClick(Sender: TObject);
begin
if radiogroup1.ItemIndex=0 then status := 0
else status := 1 ;
close;
end;
end.
Размещено на Allbest.ru
Подобные документы
Характеристика CASE-засобу Rational Rose 98/2000. Дослідження призначення панелей інструментів середовища. Причини, що стримують застосування CASE-засобів. Особливості робочого інтерфейсу Rational Rose. Відмінність між нотаціями Booch, OMT та Unified.
лабораторная работа [260,8 K], добавлен 10.11.2021Использование CASE-средств для поддержки процессов создания и сопровождения информационных систем. Задачи графического редактора диаграмм, документатора и администратора проекта. Основные возможности IBM Rational Professional Bundle и IBM Rational Rose.
реферат [28,1 K], добавлен 30.05.2012Среда проектирования программного обеспечения Rational Rose. Унифицированный язык моделирования UML. Требования к функциональности, к безопасности, интерфейсу, настраиваемости, информационной и программной совместимости, программная документация.
курсовая работа [582,0 K], добавлен 20.07.2011Классификация автоматизированных информационных систем (АИС). Проектирование АИС складского учета с использованием CASE-средства Rational Rose. Подходы к проектированию, анализ CASE-средств. Программная реализация профессионально ориентированной АИС.
курсовая работа [1,4 M], добавлен 06.03.2012Разработка информационной системы для ведения каталога книг/читателей, поисковой системы и системы предварительных заказов на приобретение книг. Среда Rational Rose. Внесение изменений в объект. Основные операции классов и атрибуты типов данных.
лабораторная работа [417,6 K], добавлен 17.05.2013Загальна характеристика мови моделювання UML. Розробка діаграм UML з метою автоматизації продаж в магазині. Rational Rose як засіб візуального моделювання об'єктно-орієнтованих інформаційних систем. Зворотне проектування як головна перевага Rational Rose.
контрольная работа [1,7 M], добавлен 23.10.2014UML как стандарт для создания модели информационной системы. Особенности работы в средстве проектирования Rational Rose 2003. Назначение операций главного меню File и Edit. Особенности разработки диаграммы развертывания в среде IBM Rational Rose 2003.
дипломная работа [524,1 K], добавлен 27.09.2010Особенности среды визуального проектирования Borland Delphi 7.0. Этапы разработки программы и составления блок-схемы алгоритмов. Способы вычисления кусочно-заданной функции одной переменной. Рассмотрение компонентов среды Delphi, ее предназначение.
контрольная работа [703,8 K], добавлен 24.09.2012Характеристика программных продуктов Open Source: Umbrello - среды UML-моделирования на языке, Rational Rose - средства визуального моделирования объектно-ориентированных информационных систем. Описание и сравнение сайтов по созданию онлайн UML диаграмм.
контрольная работа [1,5 M], добавлен 03.11.2013Unified modeling language як мова об'єктно-орієнтованого моделювання. Дослідження сучасних сase-засобів моделювання бізнес процесів. Кодогенератор для забезпечення зв'язку між Delphi і Rose. Перелік основних інструментів для створення моделі в ERwin.
дипломная работа [3,2 M], добавлен 22.10.2012