Архитектура корпоративных систем

2,681 views

Published on

Лекция Михаила Гуренкова по архитектуре корпоративных систем в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,681
On SlideShare
0
From Embeds
0
Number of Embeds
943
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Архитектура корпоративных систем

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

×