Архитектура корпоративных систем
DESCRIPTION
Лекция Михаила Гуренкова по архитектуре корпоративных систем в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.TRANSCRIPT
![Page 1: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/1.jpg)
Архитектура корпоративных систем
![Page 2: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/2.jpg)
Планы на ближайшее время
30 марта — лабораторная работа №2
3 апреля — модульное тестирование
10 апреля — рефакторинг
17 апреля — разработка пользовательских интерфейсов
24 апреля — дизайн пользовательских интерфейсов (!!!)
![Page 3: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/3.jpg)
Виды корпоративных приложений
![Page 4: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/4.jpg)
Архитектура?
![Page 5: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/5.jpg)
Архитектура
— представление системы программного обеспечения, процесс, а также и дисциплина, посвященные эффективной разработке проекта данной системы.
![Page 6: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/6.jpg)
Модель OSI
![Page 7: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/7.jpg)
Историческая справка
![Page 8: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/8.jpg)
Историческая справка
— Все вместе
![Page 9: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/9.jpg)
Историческая справка
— Клиентское приложение
— Сервер баз данных
![Page 10: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/10.jpg)
Историческая справка
— Представление (presentation)
— Домен (предметная область)
— Источник данных
![Page 11: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/11.jpg)
Задача
![Page 12: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/12.jpg)
![Page 13: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/13.jpg)
Организация логики предметной области
![Page 14: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/14.jpg)
Сценарии транзакцииclass Cart{ public DataTable GetItems();
public decimal GetTotalPrice();
public void AddItemToCart(int a_ItemId);
public void RemoveItemFromCart(int a_ItemId);
public void Offer(int a_UserId);
public DataRow GetCurrentUser();
...}
![Page 15: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/15.jpg)
Сценарии транзакцииclass Cart{ public DataTable GetItems() { XCommand command = Registry.DataBase.CreateCommand("select * from CartItems join Items
on Items.id = CartItems.id_Item where id_Session = @session"); command["session"].Value = GetSessionId(); return command.ExecuteDataTable(); }
public decimal GetTotalPrice() { XCommand command = Registry.DataBase.CreateCommand("select sum(Price * Amount) from
CartItems join Items on Items.id = CartItems.id_Item where id_Session = @session"); command["session"].Value = GetSessionId(); return (decimal)command.ExecuteScalar(); }
public void AddItemToCart(int a_ItemId) { XCommand command = Registry.DataBase.CreateCommand("insert into CartItems (id_Session,
id_Item) values (@session, @item)"); command["session"].Value = GetSessionId(); command["item"].Value = a_ItemId; command.ExecuteNonQuery(); }
![Page 16: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/16.jpg)
Модуль таблицы
— DataSet
— DataTable
— DataRow
![Page 17: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/17.jpg)
Модуль таблицыpublic void AddItemToCart(DataRow a_Item){ DataTable cartItems = new DataTable("CartItems"); DataRow newCartItem = items.NewRow(); newCartItem["id_Item"] = a_Item["id"]; newCartItem["id_Session"] = Registry.GetSessionId(); Registry.DataBase.Update(cartItems);}
![Page 18: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/18.jpg)
Модуль таблицыpublic void AddItemToCart(DB.ItemsRow a_Item){ DB.CartItems cartItems = new DB.CartItems(); DB.CartItemsRow newCartItem = items.NewRow(); newCartItem.id_Item = a_Item.id; newCartItem.id_Session = Registry.GetSessionId(); Registry.DataBase.Update(cartItems);}
![Page 19: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/19.jpg)
Модель предметной областиclass Cart{ public List<Item> Items;
public decimal GetTotalPrice();
public void Save();
...}
class Item{ public string Description;
public decimal Price;
…}
![Page 20: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/20.jpg)
Модель предметной области
Cart cart = Cart.GetCurrent();
Item item = new Item(234);
cart.Items.Add(item);
cart.Save();
![Page 21: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/21.jpg)
Модель предметной областиpublic decimal GetTotalPrice(){ decimal result = 0;
foreach(Item item in Items) { result += item.Price; }
return result;}
![Page 22: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/22.jpg)
Модель предметной областиVS сценарий транзакцииpublic decimal GetTotalPrice(){ XCommand command = Registry.DataBase.CreateCommand("select sum(Price *
Amount) from CartItems join Items on Items.id = CartItems.id_Item where id_Session = @session");
command["session"].Value = GetSessionId(); return (decimal)command.ExecuteScalar();}
public decimal GetTotalPrice(){ decimal result = 0; foreach(Item item in Items) { result += item.Price; } return result;}
![Page 23: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/23.jpg)
Сравнение
![Page 24: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/24.jpg)
:-)
![Page 25: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/25.jpg)
Организация логики работы с базой данных
![Page 26: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/26.jpg)
ActiveRow (активная запись)class Company{ DB.CompaniesRow m_Row;
public Company(DB.CompaniesRow a_Row) { m_Row = a_Row; }
public int Id { get { return m_Row.id; } } public string Alias { get { return m_Row.Alias; } set { m_Row.Alias = value; } } public string FullName { get { return m_Row.FullName; } set { m_Row.FullName = value; } }
public void Save() { XRegistry.DataBase.Update(m_Row); }}
![Page 27: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/27.jpg)
ActiveRowpublic static Company Find(int a_Id){ XCommand command = Registry.DataBase.CreateCommand("select
* from Companies where id = @id"); command["id"].Value = a_Id; DB.CompaniesRow row =
command.ExecuteDataTable<DB.Companies>()[0]; return new Company(row);}
public static Company CreateNew(){ DB.Companies table = new DB.Companies(); return new Company((DB.CompaniesRow)table.NewRow());}
![Page 28: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/28.jpg)
Data Mapper class Company{ public Company(int a_Id, string a_Alias, string a_FullName) { m_Id = a_Id; m_Alias = a_Alias; m_FullName = a_FullName; } int m_Id; public int Id { get { return m_Id; } } string m_Alias; public string Alias { get { return m_Alias; } set { m_Alias = value; } } string m_FullName; public string FullName { get { return m_FullName; } set { m_FullName = value; } } public void Save() { CompanyMapper.Instance.Save(m_Id, m_Alias, m_FullName); }}
![Page 29: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/29.jpg)
Data Mapper (преобразователь данных)class CompanyMapper{ public static CompanyMapper Instance;
public Company Find(int a_Id) { XCommand command = Registry.DataBase.CreateCommand("select * from Companies where id
= @id"); command["id"].Value = a_Id; DataRow row = command.ExecuteDataRow(); return new Company((int)row["id"], (string)row["Alias"], (string)row["FullName"]); }
public void Save(int a_Id, string a_Name, string a_FullName) { XCommand command = Registry.DataBase.CreateCommand("update Companies set Alias =
@alias, FullName = @fullname where id = @id"); command["id"].Value = a_Id; command["alias"].Value = a_Name; command["fullname"].Value = a_FullName; command.ExecuteNonQuery(); }}
![Page 30: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/30.jpg)
Объект запроса
![Page 31: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/31.jpg)
![Page 32: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/32.jpg)
Наследование с одной таблицей
![Page 33: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/33.jpg)
Наследование с таблицами для каждого конкретного класса
![Page 34: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/34.jpg)
Наследование с таблицами для каждого класса
![Page 35: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/35.jpg)
Отображение внешних записей
![Page 36: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/36.jpg)
Отображение внешних записей
XCompanyContacts m_Contacts = null;
public XCompanyContacts Contacts { get { if (m_Contacts == null) { m_Contacts = new XCompanyContacts(this); } return m_Contacts; } }
![Page 37: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/37.jpg)
Отображение внешних записей
XObjectCollection<XCompany, XCompanyGroup, DB.xCompaniesToCategories> m_Groups = null;
public XObjectCollection<XCompany, XCompanyGroup, DB.xCompaniesToCategories> Groups
{ get { if (m_Groups == null) { m_Groups = new XObjectCollection<XCompany, XCompanyGroup,
DB.xCompaniesToCategories> (this, XCompanyGroupRepostitory.Instance, "id_Company", "id_Category"); } return m_Groups; }}
![Page 38: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/38.jpg)
![Page 39: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/39.jpg)
![Page 40: Архитектура корпоративных систем](https://reader036.vdocuments.site/reader036/viewer/2022062313/558567d4d8b42a970b8b5005/html5/thumbnails/40.jpg)
Московский финал Imagine Cup!
28 марта, офис компании Microsoft Russia