Файл: Применение объектно-ориентированного подхода при проектировании информационной системы(SPARX Enterprise Architect).pdf
Добавлен: 05.04.2023
Просмотров: 478
Скачиваний: 7
СОДЕРЖАНИЕ
Глава 1. Обзор программных продуктов
§ 1.1 SPARX Enterprise Architect
Глава 2. Разработка диаграмм UML
§ 2.4 Редактирование и генерация кода
Глава 3. Visual Studio Community Edition
§ 3.1 Разработка в Дизайнере Классов
§ 3.2 Представление проекта в Дизайнере Классов
Глава 4. Проектирование UML приложения
-
-
- В проведенном исследовании были рассмотрены два программных продукта, позволяющих применять объектно-ориентированный подход для моделирования, проектирования и разработки информационных систем или других программных продуктов. Были рассмотрены сильные стороны и недостатки, проведен анализ возможностей генерации программного кода и обратного проектирования.
- Было создано собственное приложение приложение с применением объектно-ориентированного программирования.
- Существенно расширена база знаний и умений в применительно к исследуемым вопросам.
- Было создано собственное приложение приложение с применением объектно-ориентированного программирования.
- В проведенном исследовании были рассмотрены два программных продукта, позволяющих применять объектно-ориентированный подход для моделирования, проектирования и разработки информационных систем или других программных продуктов. Были рассмотрены сильные стороны и недостатки, проведен анализ возможностей генерации программного кода и обратного проектирования.
-
Можно считать исследование завершенным в требуемом объеме.
Список использованной литературы
1. Фаулер М. UML Основы – Краткое руководство по стандартному языку объектного моделирования / М. Фаулер. – Санкт-Петербург: Символ-Плюс 2018. – 192 с.
2. Ларман К. Применение UML 2.0 и шаблонов проектирования. / К. Ларман. – Москва: Вильямс. 2013 – 736 с.
интернет ресурсы
1. Enterprise Architect 15 User Guide
URL: https://www.sparxsystems.com/enterprise_architect_user_guide/15.0/
2. Microsoft Developer Network
URL: https://msdn.microsoft.com/en-us/
3. Хранилище документации Майкрософт для пользователей, разработчиков и ИТ-специалистов.
URL: https://docs.microsoft.com/ru-ru/
3. THE UNIFIED MODELING LANGUAGE SPECIFICATION
URL: https://www.omg.org/spec/UML/2.4.1/Superstructure/PDF
Приложения
Приложение 1. Листинг MainForm.cs
using System;
using System.Windows.Forms;
namespace UML_Modeller
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
ClassContainer
.GetInstance()
.AddPaintEvents(this);
}
private void LoadComboBox()
{
ClassList.Items.Clear();
ClassList.Text = "";
ClassList.Items.AddRange(
ClassContainer
.GetInstance()
.GetElementsNames()
.ToArray());
}
private void AddClassBtn_Click(object sender, EventArgs e)
{
ClassContainer
.GetInstance()
.CreateElement(ClassEdit.Text);
LoadComboBox();
}
private void ClassList_SelectedIndexChanged(object sender, EventArgs e)
{
FeaturesList.Text = "";
FeaturesList.Items.Clear();
FeaturesList.Items.AddRange(ClassContainer.GetInstance()
.GetElementByName(ClassList.Text)
.GetFeaturesNames()
.ToArray());
}
private void AddFeatureBtn_Click(object sender, EventArgs e)
{
var elem = ClassContainer.GetInstance()
.GetElementByName(ClassList.Text);
elem.AddFeature(FeatureEdit.Text, elem.GetFeaturesCount());
}
private void RenameClassBtn_Click(object sender, EventArgs e)
{
ClassContainer.GetInstance()
.GetElementByName(ClassList.Text)
.SetName(ClassEdit.Text);
LoadComboBox();
}
}
}
Приложение 2. Листинг ClassContainer.cs
using System.Collections.Generic;
using System.Windows.Forms;
namespace UML_Modeller
{
interface IUpdatable
{
void Update();
}
interface IManageContainer
{
void AddPaintEvents(Control c);
IClassElementManage CreateElement(string name);
IClassElementManage GetElementByName(string name);
List<string> GetElementsNames();
}
class ClassContainer : IManageContainer, IUpdatable
{
private static ClassContainer instance;
private static Control m_control;
private ClassContainer()
{ }
private static List<ClassElement> elements;
public void Update()
{
m_control.Refresh();
}
public static IManageContainer GetInstance()
{
if (instance == null)
{
instance = new ClassContainer();
elements = new List<ClassElement>();
}
return instance;
}
public void AddPaintEvents(Control c)
{
m_control = c;
c.Paint += ControlPaint;
c.MouseDown += ControlMouseDown;
c.MouseUp += ControlMouseUp;
c.MouseMove += ControlMouseMove;
}
//Set Form to DoubleBuffered to avoid flickering
private void ControlMouseMove(object sender, MouseEventArgs e)
{
bool t = false;
foreach (IMoveable elem in elements)
{
if (!t) t = elem.SetPos(e.Location);
}
if (t) m_control.Refresh();
}
private void ControlMouseUp(object sender, MouseEventArgs e)
{
foreach (IMoveable elem in elements)
{
elem.Unhook();
}
}
private void ControlMouseDown(object sender, MouseEventArgs e)
{
foreach (IMoveable elem in elements)
{
elem.CheckClick(e.Location);
}
}
private void ControlPaint(object sender, PaintEventArgs e)
{
foreach (IDraw elem in elements)
{
elem.Draw(e.Graphics);
}
}
public IClassElementManage CreateElement(string name)
{
var ce = new ClassElement(name, this);
elements.Add(ce);
m_control.Refresh();
return ce;
}
public IClassElementManage GetElementByName(string name)
{
foreach (IClassElementManage elem in elements)
{
if (elem.GetName() == name) return elem;
}
return null;
}
public List<string> GetElementsNames()
{
List<string> l = new List<string>();
foreach (IClassElementManage elem in elements)
{
l.Add(elem.GetName());
}
return l;
}
}
}
Приложение 3. Листинг ClassElement.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
namespace UML_Modeller
{
interface IMoveable
{
void CheckClick(Point p);
void Unhook();
bool SetPos(Point p);
}
interface IDraw
{
void Draw(Graphics g);
}
interface IClassElementManage
{
IClassElementManage AddFeature(string fname, int order);
string GetName();
IClassElementManage SetName(string name);
List<string> GetFeaturesNames();
int GetFeaturesCount();
}
class ClassElement : IDraw, IMoveable, IClassElementManage
{
private string Name;
public Rectangle Space;
public Rectangle Title;
public Font TitleFont;
public Point TitleCenter;
public SizeF TitleSize;
public static Rectangle LastSpace;
private static IUpdatable Container;
public List<Feature> features;
private bool hooked;
public ClassElement(string n, IUpdatable container)
{
TitleFont = new Font("Courier New", 12.0F, FontStyle.Bold);
Container = container;
hooked = false;
features = new List<Feature>();
Name = n;
if (LastSpace.X == 0)
{
Space = new Rectangle(20, 20, 0, 0);
LastSpace = Space;
return;
}
else
{
Space = new Rectangle(LastSpace.X + 20,
LastSpace.Y + 20, 0, 0);
LastSpace = Space;
}
}
public IClassElementManage AddFeature(string fname, int order)
{
var f = new Feature(fname, this, order);
features.Add(f);
Container.Update();
return this;
}
public List<string> GetFeaturesNames()
{
List<string> l = new List<string>();
foreach (Feature f in features)
{
l.Add(f.GetName());
}
return l;
}
public int GetFeaturesCount()
{
return features.Count();
}
public string GetName()
{
return Name;
}
public IClassElementManage SetName(string name)
{
Name = name;
Container.Update();
return this;
}
private bool mds;
private Point movediff;
public bool SetPos(Point p)
{
if (!mds && hooked)
{
movediff.X = p.X - Space.X;
movediff.Y = p.Y - Space.Y;
mds = true;
}
if (!hooked) return false;
Space.X = p.X - movediff.X;
Space.Y = p.Y - movediff.Y;
return true;
}
public void Unhook()
{
hooked = false;
mds = false;
}
public void CheckClick(Point p)
{
if (Title.Contains(p)) hooked = true;
}
private Size FeaturesSize;
private void CalculateFeaturesSize(Graphics g)
{
SizeF tmp = new SizeF(0,0);
foreach (Feature f in features)
{
SizeF t = f.GetSize(g);
if (tmp.Width < t.Width) tmp.Width = t.Width;
tmp.Height += t.Height;
}
FeaturesSize.Width = (int) tmp.Width+20;
FeaturesSize.Height = (int) tmp.Height+20;
}
private void CalculateTitleSize(Graphics g)
{
TitleSize = g.MeasureString(Name, TitleFont);
Title.X = Space.X;
Title.Y = Space.Y;
Title.Height = (int)TitleSize.Height + 20;
Title.Width = (int)TitleSize.Width +20;
}
private void RecalcSpace()
{
if (FeaturesSize.Width < Title.Width) Space.Width = Title.Width;
else
{
Space.Width = FeaturesSize.Width;
Title.Width = Space.Width;
}
Space.Height = Title.Height + FeaturesSize.Height;
}
public void CalculateTitleCenter()
{
TitleCenter.Y = Title.Y + 10;
TitleCenter.X = Space.X + (Math.Abs((int)Space.Width
- (int)TitleSize.Width)) / 2;
}
public void Draw(Graphics g)
{
CalculateFeaturesSize(g);
CalculateTitleSize(g);
RecalcSpace();
CalculateTitleCenter();
g.FillRectangle(Brushes.LightGray, Space);
g.DrawRectangle(Pens.Black, Title);
g.DrawRectangle(Pens.Black, Space);
g.DrawString(Name, TitleFont, Brushes.Black, TitleCenter);
foreach (IDraw elem in features)
{
elem.Draw(g);
}
}
}
}
Приложение 4. Листинг Feature.cs
using System;
using System.Drawing;
namespace UML_Modeller
{
class Feature : IDraw
{
ClassElement Parent;
string Name;
Font FeatureFont;
int m_order;
int NameWidth;
int NameHeight;
public Feature(String name, ClassElement parent, int order)
{
Parent = parent;
Name = name;
m_order = order;
}
public SizeF GetSize(Graphics g)
{
FeatureFont = new Font("Courier New", 12.0F,
FontStyle.Regular);
SizeF s = g.MeasureString(Name, FeatureFont);
NameWidth = (int)s.Width;
NameHeight = (int)s.Height;
return s;
}
public string GetName()
{
return Name;
}
public void Draw(Graphics g)
{
g.DrawString(Name, FeatureFont, Brushes.Black,
Parent.Title.X + 10,
Parent.Title.Y + Parent.Title.Height + 5 +
m_order * NameHeight);
}
}
}
-
Ларман К. Применение UML 2.0 и шаблонов проектирования. Практическое руководство. М:2013 с.38 ↑
-
Фаулер М. UML Основы СПб:2018 с.61 ↑
-
Мартин Фаулер. UML Основы с.94 ↑
-
UML Superstructure Specification, v2.1.1, p.69 ↑
-
https://docs.microsoft.com/ru-ru/visualstudio/modeling/what-s-new-for-design-in-visual-studio?view=vs-2017&viewFallbackFrom=vs-2019 ↑