Файл: Применение объектно-ориентированного подхода при проектировании информационной системы(SPARX Enterprise Architect).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 05.04.2023

Просмотров: 478

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
      1. В проведенном исследовании были рассмотрены два программных продукта, позволяющих применять объектно-ориентированный подход для моделирования, проектирования и разработки информационных систем или других программных продуктов. Были рассмотрены сильные стороны и недостатки, проведен анализ возможностей генерации программного кода и обратного проектирования.
        1. Было создано собственное приложение приложение с применением объектно-ориентированного программирования.
          1. Существенно расширена база знаний и умений в применительно к исследуемым вопросам.

Можно считать исследование завершенным в требуемом объеме.

Список использованной литературы

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);

}

}

}

  1. Ларман К. Применение UML 2.0 и шаблонов проектирования. Практическое руководство. М:2013 с.38

  2. Фаулер М. UML Основы СПб:2018 с.61

  3. Мартин Фаулер. UML Основы с.94

  4. UML Superstructure Specification, v2.1.1, p.69

  5. https://docs.microsoft.com/ru-ru/visualstudio/modeling/what-s-new-for-design-in-visual-studio?view=vs-2017&viewFallbackFrom=vs-2019